Annotation of win32/gc/doc/README.win32, revision 1.3

1.3     ! paf         1: The collector has at various times been compiled under Windows 95 & later, NT,
        !             2: and XP, with the original Microsoft SDK, with Visual C++ 2.0, 4.0, and 6, with
        !             3: the GNU win32 tools, with Borland 4.5,  with Watcom C, and recently
1.1       paf         4: with the Digital Mars compiler.  It is likely that some of these have been
                      5: broken in the meantime.  Patches are appreciated.
                      6: 
1.3     ! paf         7: For historical reasons,
        !             8: the collector test program "gctest" is linked as a GUI application,
1.1       paf         9: but does not open any windows.  Its output appears in the file
                     10: "gc.log".  It may be started from the file manager.  The hour glass
                     11: cursor may appear as long as it's running.  If it is started from the
                     12: command line, it will usually run in the background.  Wait a few
                     13: minutes (a few seconds on a modern machine) before you check the output.
                     14: You should see either a failure indication or a "Collector appears to
                     15: work" message.
                     16: 
                     17: The cord test program has not been ported (but should port
                     18: easily).  A toy editor (cord/de.exe) based on cords (heavyweight
                     19: strings represented as trees) has been ported and is included.
                     20: It runs fine under either win32 or win32S.  It serves as an example
                     21: of a true Windows application, except that it was written by a
                     22: nonexpert Windows programmer.  (There are some peculiarities
                     23: in the way files are displayed.  The <cr> is displayed explicitly
                     24: for standard DOS text files.  As in the UNIX version, control
                     25: characters are displayed explicitly, but in this case as red text.
                     26: This may be suboptimal for some tastes and/or sets of default
                     27: window colors.)
                     28: 
                     29: In general -DREDIRECT_MALLOC is unlikely to work unless the
                     30: application is completely statically linked.
                     31: 
                     32: The collector normally allocates memory from the OS with VirtualAlloc.
                     33: This appears to cause problems under Windows NT and Windows 2000 (but
                     34: not Windows 95/98) if the memory is later passed to CreateDIBitmap.
                     35: To work around this problem, build the collector with -DUSE_GLOBAL_ALLOC.
                     36: This is currently incompatible with -DUSE_MUNMAP.  (Thanks to Jonathan
                     37: Clark for tracking this down.  There's some chance this may be fixed
                     38: in 6.1alpha4, since we now separate heap sections with an unused page.)
                     39: 
1.3     ! paf        40: Microsoft Tools
        !            41: ---------------
1.1       paf        42: For Microsoft development tools, rename NT_MAKEFILE as
                     43: MAKEFILE.  (Make sure that the CPU environment variable is defined
                     44: to be i386.)  In order to use the gc_cpp.h C++ interface, all
                     45: client code should include gc_cpp.h.
                     46: 
1.3     ! paf        47: For historical reasons,
        !            48: the collector test program "gctest" is linked as a GUI application,
        !            49: but does not open any windows.  Its output appears in the file
        !            50: "gc.log".  It may be started from the file manager.  The hour glass
        !            51: cursor may appear as long as it's running.  If it is started from the
        !            52: command line, it will usually run in the background.  Wait a few
        !            53: minutes (a few seconds on a modern machine) before you check the output.
        !            54: You should see either a failure indication or a "Collector appears to
        !            55: work" message.
        !            56: 
1.2       paf        57: If you would prefer a VC++.NET project file, ask boehm@acm.org.  One has
                     58: been contributed, but it seems to contain some absolute paths etc., so
                     59: it can presumably only be a starting point, and is not in the standard
                     60: distribution.  It is unclear (to me, Hans Boehm) whether it is feasible to
                     61: change that.
                     62: 
1.1       paf        63: Clients may need to define GC_NOT_DLL before including gc.h, if the
                     64: collector was built as a static library (as it normally is in the
                     65: absence of thread support).
                     66: 
1.3     ! paf        67: GNU Tools
        !            68: ---------
1.1       paf        69: For GNU-win32, use the regular makefile, possibly after uncommenting
                     70: the line "include Makefile.DLLs".  The latter should be necessary only
1.3     ! paf        71: if you want to package the collector as a DLL.
        !            72: [Is the following sentence obsolete? -HB] The GNU-win32 port is
1.1       paf        73: believed to work only for b18, not b19, probably due to linker changes
                     74: in b19.  This is probably fixable with a different definition of
                     75: DATASTART and DATAEND in gcconfig.h.
                     76: 
1.3     ! paf        77: The collector should also be buildable under Cygwin with either the
        !            78: old standard Makefile, or with the "configure;make" machinery.
        !            79: 
        !            80: Borland Tools
        !            81: -------------
        !            82: [Rarely tested.]
1.1       paf        83: For Borland tools, use BCC_MAKEFILE.  Note that
                     84: Borland's compiler defaults to 1 byte alignment in structures (-a1),
                     85: whereas Visual C++ appears to default to 8 byte alignment (/Zp8).
                     86: The garbage collector in its default configuration EXPECTS AT
                     87: LEAST 4 BYTE ALIGNMENT.  Thus the BORLAND DEFAULT MUST
                     88: BE OVERRIDDEN.  (In my opinion, it should usually be anyway.
                     89: I expect that -a1 introduces major performance penalties on a
                     90: 486 or Pentium.)  Note that this changes structure layouts.  (As a last
                     91: resort, gcconfig.h can be changed to allow 1 byte alignment.  But
                     92: this has significant negative performance implications.)
                     93: The Makefile is set up to assume Borland 4.5.  If you have another
                     94: version, change the line near the top.  By default, it does not
                     95: require the assembler.  If you do have the assembler, I recommend
                     96: removing the -DUSE_GENERIC.
                     97: 
1.3     ! paf        98: Incremental Collection
        !            99: ----------------------
1.1       paf       100: There is some support for incremental collection.  This is
                    101: currently pretty simple-minded.  Pages are protected.  Protection
                    102: faults are caught by a handler installed at the bottom of the handler
                    103: stack.  This is both slow and interacts poorly with a debugger.
                    104: Whenever possible, I recommend adding a call to
                    105: GC_enable_incremental at the last possible moment, after most
                    106: debugging is complete.  Unlike the UNIX versions, no system
                    107: calls are wrapped by the collector itself.  It may be necessary
                    108: to wrap ReadFile calls that use a buffer in the heap, so that the
                    109: call does not encounter a protection fault while it's running.
                    110: (As usual, none of this is an issue unless GC_enable_incremental
                    111: is called.)
                    112: 
                    113: Note that incremental collection is disabled with -DSMALL_CONFIG.
                    114: 
1.3     ! paf       115: Threads
        !           116: -------
        !           117: 
        !           118: James Clark has contributed the necessary code to support win32 threads
        !           119: with the collector in a DLL.
1.1       paf       120: Use NT_THREADS_MAKEFILE (a.k.a gc.mak) instead of NT_MAKEFILE
                    121: to build this version.  Note that this requires some files whose names
                    122: are more than 8 + 3 characters long.  Thus you should unpack the tar file
                    123: so that long file names are preserved.  To build the garbage collector
                    124: test with VC++ from the command line, use
                    125: 
                    126: nmake /F ".\gc.mak" CFG="gctest - Win32 Release"
                    127: 
                    128: This requires that the subdirectory gctest\Release exist.
                    129: The test program and DLL will reside in the Release directory.
                    130: 
                    131: This version relies on the collector residing in a dll.
                    132: 
                    133: This version currently supports incremental collection only if it is
                    134: enabled before any additional threads are created.
                    135: 
1.3     ! paf       136: Since 6.3alpha2, threads are also better supported in static library builds
        !           137: with Microsoft tools (use NT_STATIC_THREADS_MAKEFILE) and with the GNU
        !           138: tools.  In all cases,the collector must be built with GC_WIN32_THREADS
        !           139: defined, even if the Cygwin pthreads interface is used.
        !           140: (NT_STATIC_THREADS_MAKEFILE does this implicitly.  Under Cygwin,
        !           141: ./configure --enable-threads=posix defines GC_WIN32_THREADS.)  Threads must be
        !           142: created with GC_CreateThread.  This can be accomplished by
        !           143: including gc.h and then calling CreateThread, which is redefined
        !           144: by gc.h.
        !           145: 
        !           146: For the statically linked versions, it is required that GC_init()
        !           147: be called before other GC calls, since there seems to be no implicit way
        !           148: to initialize the allocation lock.  The easiest way to ensure this in
        !           149: portable code is to call GC_INIT() from the main executable (not
        !           150: a dynamic library) before calling any other GC_ routines.
        !           151: 
        !           152: We strongly advise against using the TerminateThread() win32 API call,
        !           153: especially with the garbage collector.  Any use is likely to provoke a
        !           154: crash in the GC, since it makes it impossible for the collector to
        !           155: correctly track threads.
        !           156: 
        !           157: 
        !           158: Watcom compiler
        !           159: ---------------
1.1       paf       160: 
                    161: Ivan V. Demakov's README for the Watcom port:
                    162: 
                    163: The collector has been compiled with Watcom C 10.6 and 11.0.
                    164: It runs under win32, win32s, and even under msdos with dos4gw
                    165: dos-extender. It should also run under OS/2, though this isn't
                    166: tested. Under win32 the collector can be built either as dll
                    167: or as static library.
                    168: 
                    169: Note that all compilations were done under Windows 95 or NT.
                    170: For unknown reason compiling under Windows 3.11 for NT (one
                    171: attempt has been made) leads to broken executables.
                    172: 
                    173: Incremental collection is not supported.
                    174: 
                    175: cord is not ported.
                    176: 
                    177: Before compiling you may need to edit WCC_MAKEFILE to set target
                    178: platform, library type (dynamic or static), calling conventions, and
                    179: optimization options.
                    180: 
                    181: To compile the collector and testing programs use the command:
                    182:     wmake -f WCC_MAKEFILE
                    183: 
                    184: All programs using gc should be compiled with 4-byte alignment.
                    185: For further explanations on this see comments about Borland.
                    186: 
1.2       paf       187: If the gc is compiled as dll, the macro ``GC_DLL'' should be defined before
1.1       paf       188: including "gc.h" (for example, with -DGC_DLL compiler option). It's
                    189: important, otherwise resulting programs will not run.
                    190: 
                    191: Ivan Demakov (email: ivan@tgrad.nsk.su)
                    192: 
1.3     ! paf       193: Win32S
        !           194: ------
        !           195: 
        !           196: [The following is probably obsolete.  The win32s support is still in the
        !           197: collector, but I doubt anyone cares, or has tested it recently.]
        !           198: 
        !           199: The collector runs under both win32s and win32, but with different semantics.
        !           200: Under win32, all writable pages outside of the heaps and stack are
        !           201: scanned for roots.  Thus the collector sees pointers in DLL data
        !           202: segments.  Under win32s, only the main data segment is scanned.
        !           203: (The main data segment should always be scanned.  Under some
        !           204: versions of win32s, other regions may also be scanned.)
        !           205: Thus all accessible objects should be accessible from local variables
        !           206: or variables in the main data segment.  Alternatively, other data
        !           207: segments (e.g. in DLLs) may be registered with the collector by
        !           208: calling GC_init() and then GC_register_root_section(a), where
        !           209: a is the address of some variable inside the data segment.  (Duplicate
        !           210: registrations are ignored, but not terribly quickly.)
        !           211: 
        !           212: (There are two reasons for this.  We didn't want to see many 16:16
        !           213: pointers.  And the VirtualQuery call has different semantics under
        !           214: the two systems, and under different versions of win32s.)
1.1       paf       215: 

E-mail: