164 lines
7.2 KiB
Plaintext
164 lines
7.2 KiB
Plaintext
|
The collector has only been compiled under Windows NT, with the
|
||
|
original Microsoft SDK, with Visual C++ 2.0 and later, with
|
||
|
the GNU win32 environment, with Borland 4.5, and recently with
|
||
|
Watcom C.
|
||
|
|
||
|
It runs under both win32s and win32, but with different semantics.
|
||
|
Under win32, all writable pages outside of the heaps and stack are
|
||
|
scanned for roots. Thus the collector sees pointers in DLL data
|
||
|
segments. Under win32s, only the main data segment is scanned.
|
||
|
(The main data segment should always be scanned. Under some
|
||
|
versions of win32s, other regions may also be scanned.)
|
||
|
Thus all accessible objects should be accessible from local variables
|
||
|
or variables in the main data segment. Alternatively, other data
|
||
|
segments (e.g. in DLLs) may be registered with the collector by
|
||
|
calling GC_init() and then GC_register_root_section(a), where
|
||
|
a is the address of some variable inside the data segment. (Duplicate
|
||
|
registrations are ignored, but not terribly quickly.)
|
||
|
|
||
|
(There are two reasons for this. We didn't want to see many 16:16
|
||
|
pointers. And the VirtualQuery call has different semantics under
|
||
|
the two systems, and under different versions of win32s.)
|
||
|
|
||
|
The collector test program "gctest" is linked as a GUI application,
|
||
|
but does not open any windows. Its output appears in the file
|
||
|
"gc.log". It may be started from the file manager. The hour glass
|
||
|
cursor will appear as long as it's running.
|
||
|
|
||
|
The cord test program has not been ported (but should port
|
||
|
easily). A toy editor (cord/de.exe) based on cords (heavyweight
|
||
|
strings represented as trees) has been ported and is included.
|
||
|
It runs fine under either win32 or win32S. It serves as an example
|
||
|
of a true Windows application, except that it was written by a
|
||
|
nonexpert Windows programmer. (There are some peculiarities
|
||
|
in the way files are displayed. The <cr> is displayed explicitly
|
||
|
for standard DOS text files. As in the UNIX version, control
|
||
|
characters are displayed explicitly, but in this case as red text.
|
||
|
This may be suboptimal for some tastes and/or sets of default
|
||
|
window colors.)
|
||
|
|
||
|
For Microsoft development tools, rename NT_MAKEFILE as
|
||
|
MAKEFILE. (Make sure that the CPU environment variable is defined
|
||
|
to be i386.)
|
||
|
|
||
|
For GNU-win32, use the regular makefile, possibly after uncommenting
|
||
|
the line "include Makefile.DLLs". The latter should be necessary only
|
||
|
if you want to package the collector as a DLL. The GNU-win32 port is
|
||
|
believed to work only for b18, not b19, probably dues to linker changes
|
||
|
in b19. This is probably fixable with a different definition of
|
||
|
DATASTART and DATAEND in config.h.
|
||
|
|
||
|
For Borland tools, use BCC_MAKEFILE. Note that
|
||
|
Borland's compiler defaults to 1 byte alignment in structures (-a1),
|
||
|
whereas Visual C++ appears to default to 8 byte alignment (/Zp8).
|
||
|
The garbage collector in its default configuration EXPECTS AT
|
||
|
LEAST 4 BYTE ALIGNMENT. Thus the BORLAND DEFAULT MUST
|
||
|
BE OVERRIDDEN. (In my opinion, it should usually be anyway.
|
||
|
I expect that -a1 introduces major performance penalties on a
|
||
|
486 or Pentium.) Note that this changes structure layouts. (As a last
|
||
|
resort, config.h can be changed to allow 1 byte alignment. But
|
||
|
this has significant negative performance implications.)
|
||
|
The Makefile is set up to assume Borland 4.5. If you have another
|
||
|
version, change the line near the top. By default, it does not
|
||
|
require the assembler. If you do have the assembler, I recommend
|
||
|
removing the -DUSE_GENERIC.
|
||
|
|
||
|
Incremental collection support was recently added. This is
|
||
|
currently pretty simpleminded. Pages are protected. Protection
|
||
|
faults are caught by a handler installed at the bottom of the handler
|
||
|
stack. This is both slow and interacts poorly with a debugger.
|
||
|
Whenever possible, I recommend adding a call to
|
||
|
GC_enable_incremental at the last possible moment, after most
|
||
|
debugging is complete. Unlike the UNIX versions, no system
|
||
|
calls are wrapped by the collector itself. It may be necessary
|
||
|
to wrap ReadFile calls that use a buffer in the heap, so that the
|
||
|
call does not encounter a protection fault while it's running.
|
||
|
(As usual, none of this is an issue unless GC_enable_incremental
|
||
|
is called.)
|
||
|
|
||
|
Note that incremental collection is disabled with -DSMALL_CONFIG,
|
||
|
which is the default for win32. If you need incremental collection,
|
||
|
undefine SMALL_CONFIG.
|
||
|
|
||
|
Incremental collection is not supported under win32s, and it may not
|
||
|
be possible to do so. However, win32 applications that attempt to use
|
||
|
incremental collection should continue to run, since the
|
||
|
collector detects if it's running under win32s and turns calls to
|
||
|
GC_enable_incremental() into noops.
|
||
|
|
||
|
James Clark has contributed the necessary code to support win32 threads.
|
||
|
This code is known to exhibit some problems with incremental collection
|
||
|
enabled. Use NT_THREADS_MAKEFILE (a.k.a gc.mak) instead of NT_MAKEFILE
|
||
|
to build this version. Note that this requires some files whose names
|
||
|
are more than 8 + 3 characters long. Thus you should unpack the tar file
|
||
|
so that long file names are preserved. To build the garbage collector
|
||
|
test with VC++ from the command line, use
|
||
|
|
||
|
nmake /F ".\gc.mak" CFG="gctest - Win32 Release"
|
||
|
|
||
|
This requires that the subdirectory gctest\Release exist.
|
||
|
|
||
|
This version relies on the collector residing in a dll.
|
||
|
|
||
|
This version currently supports incremental collection only if it is
|
||
|
enabled before any additional threads are created.
|
||
|
It is known to not be completely solid. At a minimum it can deadlock
|
||
|
if a thread starts in the middle of an allocation. There may be
|
||
|
other problems. If you need solid support for win32 threads, you
|
||
|
check with Geodesic Systems. I haven't tried it, but they claim
|
||
|
to support it.
|
||
|
|
||
|
Hans
|
||
|
|
||
|
Ivan V. Demakov's README for the Watcom port:
|
||
|
|
||
|
[ He points out in a later message that there may be a problem compiling
|
||
|
under Windows-3.11 for Windows NT. ]
|
||
|
|
||
|
Watcom C/C++ 10.5, 10.6, 11.0 tested.
|
||
|
|
||
|
The collector runs on WIN32 and DOS4GW dos-extender with both
|
||
|
stack and register based calling conventions (options -5r and -5s).
|
||
|
Incremental collection not supported.
|
||
|
|
||
|
OS/2 not tested, but should work (only some #ifdef's added for OS/2 port).
|
||
|
|
||
|
cord not ported. Watcom C fails to compile it, from first attempt.
|
||
|
Since I don't use it, I don't try to fix it.
|
||
|
|
||
|
cpp_test succeeds, but not compiled automaticaly with WCC_MAKEFILE.
|
||
|
|
||
|
|
||
|
My changes:
|
||
|
|
||
|
* config.h Added definitions for Watcom C/C++.
|
||
|
Undefined MPROTECT_VDB for Watcom C/C++ MSWIN32,
|
||
|
I don't have idea why it not work.
|
||
|
|
||
|
* gc.h Explicitly declared GC_noop. This prevents
|
||
|
program crash, compiled with -5r option.
|
||
|
|
||
|
* gc_priv.h Changed declaration for GC_push_one to make
|
||
|
compiler happy.
|
||
|
Added GC_dos4gw_get_mem declaration and
|
||
|
GET_MEM uses it in DOS4GW environment.
|
||
|
|
||
|
* os_dep.c Added __WATCOMC__ and DOS4GW #ifdef's.
|
||
|
Added GC_dos4gw_get_mem.
|
||
|
|
||
|
* mach_dep.c For Watcom used setjmp method of marking registers.
|
||
|
|
||
|
* WCC_MAKEFILE New file. Makefile for Watcom C/C++.
|
||
|
|
||
|
* gc_watcom.asm New file. Some functions for DOS4GW.
|
||
|
This functions may (probably) be done in C,
|
||
|
but I can't figure out how do this for all
|
||
|
possible options of compiler.
|
||
|
|
||
|
* README.watcom This file.
|
||
|
|
||
|
|
||
|
Ivan Demakov (email: dem@tgrad.nsk.su)
|
||
|
|
||
|
|