| 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 |  | 
|---|