📄 readme.changes
字号:
This is a rough history of garbage collector bugs and versions.This has been maintained with varying diligence over the years.I made an attempt to include recent contributors here. I apologize for anyomissions.RECENT UPDATES ARE RECORDED IN ../ChangeLog FILE INSTEAD TO CONFORM TOMORE COMMON CONVENTIONS.------------------------- Version 1.3 and immediately preceding versions contained spuriousassembly language assignments to TMP_SP. Only the assignment in the PC/RTcode is necessary. On other machines, with certain compiler options,the assignments can lead to an unsaved register being overwritten.Known to cause problems under SunOS 3.5 WITHOUT the -O option. (With-O the compiler recognizes it as dead code. It probably shouldn't,but that's another story.) Version 1.4 and earlier versions used compile time determined valuesfor the stack base. This no longer works on Sun 3s, since Sun 3/80s usea different stack base. We now use a straightforward heuristic on allmachines on which it is known to work (incl. Sun 3s) and compile-timedetermined values for the rest. There should really be library callsto determine such values. Version 1.5 and earlier did not ensure 8 byte alignment for objectsallocated on a sparc based machine. Version 1.8 added ULTRIX support in gc_private.h. Version 1.9 fixed a major bug in gc_realloc. Version 2.0 introduced a consistent naming convention for collectorroutines and added support for registering dynamic library data segmentsin the standard mark_roots.c. Most of the data structures were revamped.The treatment of interior pointers was completely changed. Finalizationwas added. Support for locking was added. Object kinds were added.We added a black listing facility to avoid allocating at addresses knownto occur as integers somewhere in the address space. Much of thiswas accomplished by adapting ideas and code from the PCR collector.The test program was changed and expanded. Version 2.1 was the first stable version since 1.9, and added supportfor PPCR. Version 2.2 added debugging allocation, and fixed various bugs. Among them:- GC_realloc could fail to extend the size of the object for certain large object sizes.- A blatant subscript range error in GC_printf, which unfortunately wasn't exercised on machines with sufficient stack alignment constraints.- GC_register_displacement did the wrong thing if it was called after any allocation had taken place.- The leak finding code would eventually break after 2048 byte byte objects leaked.- interface.c didn't compile.- The heap size remained much too small for large stacks.- The stack clearing code behaved badly for large stacks, and perhaps on HP/PA machines. Version 2.3 added ALL_INTERIOR_POINTERS and fixed the following bugs:- Missing declaration of etext in the A/UX version.- Some PCR root-finding problems.- Blacklisting was not 100% effective, because the plausible future heap bounds were being miscalculated.- GC_realloc didn't handle out-of-memory correctly.- GC_base could return a nonzero value for addresses inside free blocks.- test.c wasn't really thread safe, and could erroneously report failure in a multithreaded environment. (The locking primitives need to be replaced for other threads packages.)- GC_CONS was thoroughly broken.- On a SPARC with dynamic linking, signals stayed diabled while the client code was running. (Thanks to Manuel Serrano at INRIA for reporting the last two.) Version 2.4 added GC_free_space_divisor as a tuning knob, added support for OS/2 and linux, and fixed the following bugs:- On machines with unaligned pointers (e.g. Sun 3), every 128th word could fail to be considered for marking.- Dynamic_load.c erroneously added 4 bytes to the length of the data and bss sections of the dynamic library. This could result in a bad memory reference if the actual length was a multiple of a page. (Observed on Sun 3. Can probably also happen on a Sun 4.) (Thanks to Robert Brazile for pointing out that the Sun 3 version was broken. Dynamic library handling is still broken on Sun 3s under 4.1.1U1, but apparently not 4.1.1. If you have such a machine, use -Bstatic.) Version 2.5 fixed the following bugs:- Removed an explicit call to exit(1)- Fixed calls to GC_printf and GC_err_printf, so the correct number of arguments are always supplied. The OS/2 C compiler gets confused if the number of actuals and the number of formals differ. (ANSI C doesn't require this to work. The ANSI sanctioned way of doing things causes too many compatibility problems.) Version 3.0 added generational/incremental collection and stubborn objects. Version 3.1 added the following features:- A workaround for a SunOS 4.X SPARC C compiler misfeature that caused problems when the collector was turned into a dynamic library. - A fix for a bug in GC_base that could result in a memory fault.- A fix for a performance bug (and several other misfeatures) pointed out by Dave Detlefs and Al Dosser.- Use of dirty bit information for static data under Solaris 2.X.- DEC Alpha/OSF1 support (thanks to Al Dosser).- Incremental collection on more platforms.- A more refined heap expansion policy. Less space usage by default.- Various minor enhancements to reduce space usage, and to reduce the amount of memory scanned by the collector.- Uncollectable allocation without per object overhead.- More conscientious handling of out-of-memory conditions.- Fixed a bug in debugging stubborn allocation.- Fixed a bug that resulted in occasional erroneous reporting of smashed objects with debugging allocation.- Fixed bogus leak reports of size 4096 blocks with FIND_LEAK. Version 3.2 fixed a serious and not entirely repeatable bug in the incremental collector. It appeared only when dirty bit info on the roots was available, which is normally only under Solaris. It also added GC_general_register_disappearing_link, and some testing code. Interface.c disappeared. Version 3.3 fixes several bugs and adds new ports:- PCR-specific bugs.- Missing locking in GC_free, redundant FASTUNLOCK in GC_malloc_stubborn, and 2 bugs in GC_unregister_disappearing_link. All of the above were pointed out by Neil Sharman (neil@cs.mu.oz.au).- Common symbols allocated by the SunOS4.X dynamic loader were not included in the root set.- Bug in GC_finalize (reported by Brian Beuning and Al Dosser)- Merged Amiga port from Jesper Peterson (untested)- Merged NeXT port from Thomas Funke (significantly modified and untested) Version 3.4:- Fixed a performance bug in GC_realloc.- Updated the amiga port.- Added NetBSD and 386BSD ports.- Added cord library.- Added trivial performance enhancement for ALL_INTERIOR_POINTERS. (Don't scan last word.) Version 3.5- Minor collections now mark from roots only once, if that doesn't cause an excessive pause.- The stack clearing heuristic was refined to prevent anomalies with very heavily recursive programs and sparse stacks.- Fixed a bug that prevented mark stack growth in some cases. GC_objects_are_marked should be set to TRUE after a call to GC_push_roots and as part of GC_push_marked, since both can now set mark bits. I think this is only a performance bug, but I wouldn't bet on it. It's certainly very hard to argue that the old version was correct.- Fixed an incremental collection bug that prevented it from working at all when HBLKSIZE != getpagesize()- Changed dynamic_loading.c to include gc_priv.h before testing DYNAMIC_LOADING. SunOS dynamic library scanning must have been broken in 3.4.- Object size rounding now adapts to program behavior.- Added a workaround (provided by Manuel Serrano and colleagues) to a long-standing SunOS 4.X (and 3.X?) ld bug that I had incorrectly assumed to have been squished. The collector was broken if the text segment size was within 32 bytes of a multiple of 8K bytes, and if the beginning of the data segment contained interesting roots. The workaround assumes a demand-loadable executable. The original may have have "worked" in some other cases.- Added dynamic library support under IRIX5.- Added support for EMX under OS/2 (thanks to Ari Huttunen). Version 3.6:- fixed a bug in the mark stack growth code that was introduced in 3.4.- fixed Makefile to work around DEC AXP compiler tail recursion bug.Version 3.7:- Added a workaround for an HP/UX compiler bug.- Fixed another stack clearing performance bug. Reworked that code once more. Version 4.0:- Added support for Solaris threads (which was possible only by reimplementing some fraction of Solaris threads, since Sun doesn't currently make the thread debugging interface available).- Added non-threads win32 and win32S support.- (Grudgingly, with suitable muttering of obscenities) renamed files so that the collector distribution could live on a FAT file system. Files that are guaranteed to be useless on a PC still have long names. Gc_inline.h and gc_private.h still exist, but now just include gc_inl.h and gc_priv.h.- Fixed a really obscure bug in finalization that could cause undetected mark stack overflows. (I would be surprised if any real code ever tickled this one.)- Changed finalization code to dynamically resize the hash tables it maintains. (This probably does not matter for well- -written code. It no doubt does for C++ code that overuses destructors.)- Added typed allocation primitives. Rewrote the marker to accommodate them with more reasonable efficiency. This change should also speed up marking for GC_malloc allocated objects a little. See gc_typed.h for new primitives.- Improved debugging facilities slightly. Allocation time stack traces are now kept by default on SPARC/SUNOS4. (Thanks to Scott Schwartz.)- Added better support for small heap applications.- Significantly extended cord package. Fixed a bug in the implementation of lazily read files. Printf and friends now have cord variants. Cord traversals are a bit faster.- Made ALL_INTERIOR_POINTERS recognition the default.- Fixed de so that it can run in constant space, independent of file size. Added simple string searching to cords and de.- Added the Hull-Ellis C++ interface.- Added dynamic library support for OSF/1. (Thanks to Al Dosser and Tim Bingham at DEC.)- Changed argument to GC_expand_hp to be expressed in units of bytes instead of heap blocks. (Necessary since the heap block size now varies depending on configuration. The old version was never very clean.)- Added GC_get_heap_size(). The previous "equivalent" was broken.- Restructured the Makefile a bit. Since version 4.0:- Changed finalization implementation to guarantee that finalization procedures are called outside of the allocation lock, making direct use of the interface a little less dangerous. MAY BREAK EXISTING CLIENTS that assume finalizers are protected by a lock. Since there seem to be few multithreaded clients that use finalization, this is hopefully not much of a problem.- Fixed a gross bug in CORD_prev.- Fixed a bug in blacklst.c that could result in unbounded heap growth during startup on machines that do not clear memory obtained from the OS (e.g. win32S).- Ported de editor to win32/win32S. (This is now the only version with a mouse-sensitive UI.)- Added GC_malloc_ignore_off_page to allocate large arrays in the presence of ALL_INTERIOR_POINTERS.- Changed GC_call_with_alloc_lock to not disable signals in the single-threaded case.- Reduced retry count in GC_collect_or_expand for garbage collecting when out of memory.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -