1 |
721 |
jeremybenn |
===========================================================================
|
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.
|
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)
|
179 |
|
|
|
180 |
|
|
|
181 |
|
|
TESTED WITH HARDWARE
|
182 |
|
|
|
183 |
|
|
MC68030
|
184 |
|
|
|
185 |
|
|
|
186 |
|
|
CONTACT
|
187 |
|
|
|
188 |
|
|
Please, contact me at , when you change the
|
189 |
|
|
Amiga port.
|
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, 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 |
|
|
|