Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!caen!hellgate.utah.edu!dog.ee.lbl.gov!ucsd!hub.ucsb.edu!eiffel!kimr From: kimr@eiffel.UUCP (Kim Rochat) Newsgroups: comp.lang.eiffel Subject: Patch for Eiffel version 2.3.4 garbage collector. Message-ID: <572@eiffel.UUCP> Date: 18 May 91 00:19:53 GMT Organization: Interactive Software Engineering, Santa Barbara CA Lines: 107 A defect has been found and fixed in the garbage collector of Interactive Software's release of Eiffel version 2.3.4. This defect results in a segmentation fault in some Eiffel applications using both garbage collection and class ARRAY. It most commonly occurs if the "force" routine of class ARRAY is used to dynamically grow an array, but other ARRAY operations which result in an ARRAY object being copied may also cause the problem. The segmentation fault is a consequence of the array operation, but may occur later in the system execution when the ARRAY object is scanned by the garbage collector. The context diff for the fix is included at the end of this article. Use the following instructions to apply to fix to your Eiffel installation. Assume that $EIFFEL contains the full pathname of the "Eiffel" subdirectory in the Eiffel installation directory. 1) Extract the context diff from the end of this message, placing it in /tmp/diffs. 2) cd $EIFFEL/files 3) make a backup copy of _basic.c 4) Apply the patch to _basic.c using the "patch" utility: patch < /tmp/diffs or apply the diffs to _basic.c by hand. Recompile _basic.c and recreate the runtime library _run_time.a: 5) After making a backup copy of "_makeD", Edit "_makeD" and make certain that the CFLAGS macro includes either "-DBSD" or "-DSYSTEMV", as appropriate for your platform. (CFLAGS is usually CFLAGS = -O -DBSD -DDARRAY but should be set to CFLAGS = -O -DSYSTEM -DDARRAY for Unix System V and other non-BSD Unix systems). 6) Move _run_time.a to a backup file. 7) rebuild the run_time_library: make -f _makeD This will take a few minutes while the run time files recompile. 8) Rebuild your Eiffel system using the new runtime: rm ; es 9) If you have a C package for your application, the files in the C package directory can be updated by removing the files "_run_time.a" and "_basic.c" from the C package directory and re-running the "es" command that originally generated the C package directory. Kim Rochat Interactive Software Engineering Responses to: eiffel@eiffel.com ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- *** _basic.c.old Fri May 17 15:57:56 1991 --- _basic.c Fri May 17 15:58:22 1991 *************** *** 9,15 **** #include "_mem.h" extern int16 str_DT; extern int16 gac_flag, gac_option; - extern void strcpy (); extern void str_lower (); extern int16 db_DT, int_DT, real_DT, bool_DT, char_DT; extern uint32 _rt_40a, _rt_40d; --- 9,14 ---- *************** *** 117,122 **** --- 116,123 ---- int range, start, nbelem; { OBJPTR new_area; + register OBJPTR element; + register int32 i; new_area = spAllocate (range, gentest (oldarea, 0)); #ifdef SYSTEMV memcpy((char *) (Access (new_area)+start),(char *) (Access (oldarea)),nbelem*_rt_40d); *************** *** 124,129 **** --- 125,137 ---- #ifdef BSD bcopy((char *) (Access (oldarea)),(char *) (Access (new_area)+start),nbelem*_rt_40d); #endif + if (gac_option && gentest (new_area, 0) && + ISBLACK(new_area) && !ISBLACK(oldarea)) { + for (i=0;i