Annotation of OpenXM_contrib2/asir2000/gc/doc/README.amiga, Revision 1.1
1.1 ! noro 1: ===========================================================================
! 2: Kjetil S. Matheussen's notes (28-11-2000)
! 3: ===========================================================================
! 4: Compiles under SAS/C again. Should allso still compile under other
! 5: amiga compilers without big changes. I haven't checked if it still
! 6: works under gcc, because I don't have gcc for amiga. But I have
! 7: updated 'Makefile', and hope it compiles fine.
! 8:
! 9:
! 10: WHATS NEW:
! 11:
! 12: 1.
! 13: Made a pretty big effort in preventing GCs allocating-functions from returning
! 14: chip-mem.
! 15:
! 16: The lower part of the new file AmigaOS.c does this in various ways, mainly by
! 17: wrapping GC_malloc, GC_malloc_atomic, GC_malloc_uncollectable,
! 18: GC_malloc_atomic_uncollectable, GC_malloc_stubborn, GC_malloc_ignore_off_page
! 19: and GC_malloc_atomic_ignore_off_page. GC_realloc is allso wrapped, but
! 20: doesn't do the same effort in preventing to return chip-mem.
! 21: Other allocating-functions (f.ex. GC_*_typed_) can probably be
! 22: used without any problems, but beware that the warn hook will not be called.
! 23: In case of problems, don't define GC_AMIGA_FASTALLOC.
! 24:
! 25: Programs using more time actually using the memory allocated
! 26: (instead of just allocate and free rapidly) have
! 27: the most to earn on this, but even gctest now normally runs twice
! 28: as fast and uses less memory, on my poor 8MB machine.
! 29:
! 30: The changes have only effect when there is no more
! 31: fast-mem left. But with the way GC works, it
! 32: could happen quite often. Beware that an atexit handler had to be added,
! 33: so using the abort() function will make a big memory-loss.
! 34: If you absolutely must call abort() instead of exit(), try calling
! 35: the GC_amiga_free_all_mem function before abort().
! 36:
! 37: New amiga-spesific compilation flags:
! 38:
! 39: GC_AMIGA_FASTALLOC - By NOT defining this option, GC will work like before,
! 40: it will not try to force fast-mem out of the OS, and
! 41: it will use normal calloc for allocation, and the rest
! 42: of the following flags will have no effect.
! 43:
! 44: GC_AMIGA_ONLYFAST - Makes GC never to return chip-mem. GC_AMIGA_RETRY have
! 45: no effect if this flag is set.
! 46:
! 47: GC_AMIGA_GC - If gc returns NULL, do a GC_gcollect, and try again. This
! 48: usually is a success with the standard GC configuration.
! 49: It is allso the most important flag to set to prevent
! 50: GC from returning chip-mem. Beware that it slows down a lot
! 51: when a program is rapidly allocating/deallocating when
! 52: theres either very little fast-memory left or verly little
! 53: chip-memory left. Its not a very common situation, but gctest
! 54: sometimes (very rare) use many minutes because of this.
! 55:
! 56: GC_AMIGA_RETRY - If gc succeed allocating memory, but it is chip-mem,
! 57: try again and see if it is fast-mem. Most of the time,
! 58: it will actually return fast-mem for the second try.
! 59: I have set max number of retries to 9 or size/5000. You
! 60: can change this if you like. (see GC_amiga_rec_alloc())
! 61:
! 62: GC_AMIGA_PRINTSTATS - Gather some statistics during the execution of a
! 63: program, and prints out the info when the atexit-handler
! 64: is called.
! 65:
! 66: My reccomendation is to set all this flags, except GC_AMIGA_PRINTSTATS and
! 67: GC_AMIGA_ONLYFAST.
! 68:
! 69: If your program demands high response-time, you should
! 70: not define GC_AMIGA_GC, and possible allso define GC_AMIGA_ONLYFAST.
! 71: GC_AMIGA_RETRY does not seem to slow down much.
! 72:
! 73: Allso, when compiling up programs, and GC_AMIGA_FASTALLOC was not defined when
! 74: compilling gc, you can define GC_AMIGA_MAKINGLIB to avoid having these allocation-
! 75: functions wrapped. (see gc.h)
! 76:
! 77: Note that GC_realloc must not be called before any of
! 78: the other above mentioned allocating-functions have been called. (shouldn't be
! 79: any programs doing so either, I hope).
! 80:
! 81: Another note. The allocation-function is wrapped when defining
! 82: GC_AMIGA_FASTALLOC by letting the function go thru the new
! 83: GC_amiga_allocwrapper_do function-pointer (see gc.h). Means that
! 84: sending function-pointers, such as GC_malloc, GC_malloc_atomic, etc.,
! 85: for later to be called like f.ex this, (*GC_malloc_functionpointer)(size),
! 86: will not wrap the function. This is normally not a big problem, unless
! 87: all allocation function is called like this, which will cause the
! 88: atexit un-allocating function never to be called. Then you either
! 89: have to manually add the atexit handler, or call the allocation-
! 90: functions function-pointer functions like this;
! 91: (*GC_amiga_allocwrapper_do)(size,GC_malloc_functionpointer).
! 92: There are probably better ways this problem could be handled, unfortunately,
! 93: I didn't find any without rewriting or replacing a lot of the GC-code, which
! 94: I really didn't want to. (Making new GC_malloc_* functions, and just
! 95: define f.ex GC_malloc as GC_amiga_malloc should allso work).
! 96:
! 97:
! 98: New amiga-spesific function:
! 99:
! 100: void GC_amiga_set_toany(void (*func)(void));
! 101:
! 102: 'func' is a function that will be called right before gc has to change
! 103: allocation-method from MEMF_FAST to MEMF_ANY. Ie. when it is likely
! 104: it will return chip-mem.
! 105:
! 106:
! 107: 2. A few small compiler-spesific additions to make it compile with SAS/C again.
! 108:
! 109: 3. Updated and rewritten the smakefile, so that it works again and that
! 110: the "unnecesarry" 'SCOPTIONS' files could be removed. Allso included
! 111: the cord-smakefile stuff in the main smakefile, so that the cord smakefile
! 112: could be removed too. By writing smake -f Smakefile.smk, both gc.lib and
! 113: cord.lib will be made.
! 114:
! 115:
! 116:
! 117: STILL MISSING:
! 118:
! 119: Programs can not be started from workbench, at least not for SAS/C. (Martin
! 120: Tauchmanns note about that it now works with workbench is definitely wrong
! 121: when concerning SAS/C). I guess it works if you use the old "#if 0'ed"-code,
! 122: but I haven't tested it. I think the reason for MT to replace the
! 123: "#if 0'ed"-code was only because it was a bit to SAS/C-spesific. But I
! 124: don't know. An iconx-script solves this problem anyway.
! 125:
! 126:
! 127: BEWARE!
! 128:
! 129: -To run gctest, set the stack to around 200000 bytes first.
! 130: -SAS/C-spesific: cord will crash if you compile gc.lib with
! 131: either parm=reg or parm=both. (missing legal prototypes for
! 132: function-pointers someplace is the reason I guess.).
! 133:
! 134:
! 135: tested with software: Radium, http://www.stud.ifi.uio.no/~ksvalast/radium/
! 136:
! 137: tested with hardware: MC68060
! 138:
! 139:
! 140: -ksvalast@ifi.uio.no
! 141:
! 142:
! 143: ===========================================================================
! 144: Martin Tauchmann's notes (1-Apr-99)
! 145: ===========================================================================
! 146:
! 147: Works now, also with the GNU-C compiler V2.7.2.1. <ftp://ftp.unina.it/pub/amiga/geekgadgets/amiga/m68k/snapshots/971125/amiga-bin/>
! 148: Modify the `Makefile`
! 149: CC=cc $(ABI_FLAG)
! 150: to
! 151: CC=gcc $(ABI_FLAG)
! 152:
! 153: TECHNICAL NOTES
! 154:
! 155: - `GC_get_stack_base()`, `GC_register_data_segments()` works now with every
! 156: C compiler; also Workbench.
! 157:
! 158: - Removed AMIGA_SKIP_SEG, but the Code-Segment must not be scanned by GC.
! 159:
! 160:
! 161: PROBLEMS
! 162: - When the Linker, does`t merge all Code-Segments to an single one. LD of GCC
! 163: do it always.
! 164:
! 165: - With ixemul.library V47.3, when an GC program launched from another program
! 166: (example: `Make` or `if_mach M68K AMIGA gctest`), `GC_register_data_segments()`
! 167: found the Segment-List of the caller program.
! 168: Can be fixed, if the run-time initialization code (for C programs, usually *crt0*)
! 169: support `__data` and `__bss`.
! 170:
! 171: - PowerPC Amiga currently not supported.
! 172:
! 173: - Dynamic libraries (dyn_load.c) not supported.
! 174:
! 175:
! 176: TESTED WITH SOFTWARE
! 177:
! 178: `Optimized Oberon 2 C` (oo2c) <http://cognac.informatik.uni-kl.de/download/index.html>
! 179:
! 180:
! 181: TESTED WITH HARDWARE
! 182:
! 183: MC68030
! 184:
! 185:
! 186: CONTACT
! 187:
! 188: Please, contact me at <martintauchmann@bigfoot.com>, when you change the
! 189: Amiga port. <http://martintauchmann.home.pages.de>
! 190:
! 191: ===========================================================================
! 192: Michel Schinz's notes
! 193: ===========================================================================
! 194: WHO DID WHAT
! 195:
! 196: The original Amiga port was made by Jesper Peterson. I (Michel Schinz)
! 197: modified it slightly to reflect the changes made in the new official
! 198: distributions, and to take advantage of the new SAS/C 6.x features. I also
! 199: created a makefile to compile the "cord" package (see the cord
! 200: subdirectory).
! 201:
! 202: TECHNICAL NOTES
! 203:
! 204: In addition to Jesper's notes, I have the following to say:
! 205:
! 206: - Starting with version 4.3, gctest checks to see if the code segment is
! 207: added to the root set or not, and complains if it is. Previous versions
! 208: of this Amiga port added the code segment to the root set, so I tried to
! 209: fix that. The only problem is that, as far as I know, it is impossible to
! 210: know which segments are code segments and which are data segments (there
! 211: are indeed solutions to this problem, like scanning the program on disk
! 212: or patch the LoadSeg functions, but they are rather complicated). The
! 213: solution I have chosen (see os_dep.c) is to test whether the program
! 214: counter is in the segment we are about to add to the root set, and if it
! 215: is, to skip the segment. The problems are that this solution is rather
! 216: awkward and that it works only for one code segment. This means that if
! 217: your program has more than one code segment, all of them but one will be
! 218: added to the root set. This isn't a big problem in fact, since the
! 219: collector will continue to work correctly, but it may be slower.
! 220:
! 221: Anyway, the code which decides whether to skip a segment or not can be
! 222: removed simply by not defining AMIGA_SKIP_SEG. But notice that if you do
! 223: so, gctest will complain (it will say that "GC_is_visible produced wrong
! 224: failure indication"). However, it may be useful if you happen to have
! 225: pointers stored in a code segment (you really shouldn't).
! 226:
! 227: If anyone has a good solution to the problem of finding, when a program
! 228: is loaded in memory, whether a segment is a code or a data segment,
! 229: please let me know.
! 230:
! 231: PROBLEMS
! 232:
! 233: If you have any problem with this version, please contact me at
! 234: schinz@alphanet.ch (but do *not* send long files, since we pay for
! 235: every mail!).
! 236:
! 237: ===========================================================================
! 238: Jesper Peterson's notes
! 239: ===========================================================================
! 240:
! 241: ADDITIONAL NOTES FOR AMIGA PORT
! 242:
! 243: These notes assume some familiarity with Amiga internals.
! 244:
! 245: WHY I PORTED TO THE AMIGA
! 246:
! 247: The sole reason why I made this port was as a first step in getting
! 248: the Sather(*) language on the Amiga. A port of this language will
! 249: be done as soon as the Sather 1.0 sources are made available to me.
! 250: Given this motivation, the garbage collection (GC) port is rather
! 251: minimal.
! 252:
! 253: (*) For information on Sather read the comp.lang.sather newsgroup.
! 254:
! 255: LIMITATIONS
! 256:
! 257: This port assumes that the startup code linked with target programs
! 258: is that supplied with SAS/C versions 6.0 or later. This allows
! 259: assumptions to be made about where to find the stack base pointer
! 260: and data segments when programs are run from WorkBench, as opposed
! 261: to running from the CLI. The compiler dependent code is all in the
! 262: GC_get_stack_base() and GC_register_data_segments() functions, but
! 263: may spread as I add Amiga specific features.
! 264:
! 265: Given that SAS/C was assumed, the port is set up to be built with
! 266: "smake" using the "SMakefile". Compiler options in "SCoptions" can
! 267: be set with "scopts" program. Both "smake" and "scopts" are part of
! 268: the SAS/C commercial development system.
! 269:
! 270: In keeping with the porting philosophy outlined above, this port
! 271: will not behave well with Amiga specific code. Especially not inter-
! 272: process comms via messages, and setting up public structures like
! 273: Intuition objects or anything else in the system lists. For the
! 274: time being the use of this library is limited to single threaded
! 275: ANSI/POSIX compliant or near-complient code. (ie. Stick to stdio
! 276: for now). Given this limitation there is currently no mechanism for
! 277: allocating "CHIP" or "PUBLIC" memory under the garbage collector.
! 278: I'll add this after giving it considerable thought. The major
! 279: problem is the entire physical address space may have to me scanned,
! 280: since there is no telling who we may have passed memory to.
! 281:
! 282: If you allocate your own stack in client code, you will have to
! 283: assign the pointer plus stack size to GC_stackbottom.
! 284:
! 285: The initial stack size of the target program can be compiled in by
! 286: setting the __stack symbol (see SAS documentaion). It can be over-
! 287: ridden from the CLI by running the AmigaDOS "stack" program, or from
! 288: the WorkBench by setting the stack size in the tool types window.
! 289:
! 290: SAS/C COMPILER OPTIONS (SCoptions)
! 291:
! 292: You may wish to check the "CPU" code option is appropriate for your
! 293: intended target system.
! 294:
! 295: Under no circumstances set the "StackExtend" code option in either
! 296: compiling the library or *ANY* client code.
! 297:
! 298: All benign compiler warnings have been suppressed. These mainly
! 299: involve lack of prototypes in the code, and dead assignments
! 300: detected by the optimizer.
! 301:
! 302: THE GOOD NEWS
! 303:
! 304: The library as it stands is compatible with the GigaMem commercial
! 305: virtual memory software, and probably similar PD software.
! 306:
! 307: The performance of "gctest" on an Amiga 2630 (68030 @ 25Mhz)
! 308: compares favourably with an HP9000 with similar architecture (a 325
! 309: with a 68030 I think).
! 310:
! 311: -----------------------------------------------------------------------
! 312:
! 313: The Amiga port has been brought to you by:
! 314:
! 315: Jesper Peterson.
! 316:
! 317: jep@mtiame.mtia.oz.au (preferred, but 1 week turnaround)
! 318: jep@orca1.vic.design.telecom.au (that's orca<one>, 1 day turnaround)
! 319:
! 320: At least one of these addresses should be around for a while, even
! 321: though I don't work for either of the companies involved.
! 322:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>