if ( isbitclear(startbits, blocknum) ) return;
if ( isbitset(markbits, blocknum) ) return;
+ fprintf(stderr, "mark: marking object at 0x%lx\n", obj);
setbit (markbits, blocknum);
if ( isbitclear(referencebits, blocknum) ) return;
#else
void **top_of_stack = &dummy;
+ fprintf(stderr, "marking stack\n");
+
if (top_of_stack > bottom_of_stack)
markreferences(bottom_of_stack, top_of_stack);
else
/* Alle vom Stack referenzierten Objekte markieren */
asm_dumpregistersandcall (markstack);
+ fprintf(stderr, "marking references\n");
/* Alle von globalen Variablen erreichbaren Objekte markieren */
p = chain_first (allglobalreferences);
while (p) {
/* Ende des freien Bereiches suchen */
freeend = findnextsetbit (markbits, topofheap, freestart+1);
+#if 0
+ if (freeend==topofheap) {
+ topofheap = freestart;
+ heapfreemem += (freeend-freestart);
+ goto freememfinished;
+ } else {
+ fprintf(stderr, "%lx -- %lx\n", heap + freestart, heap + freeend);
+#endif
+
/* Freien Bereich in Freispeicherliste einh"angen */
- memlist_addrange (freestart, freeend-freestart);
+ memlist_addrange (freestart, freeend-freestart);
/* Menge des freien Speichers mitnotieren */
- heapfreemem += (freeend-freestart);
+ heapfreemem += (freeend-freestart);
+#if 0
}
+#endif
+ }
freememfinished:
u4 freestart,freelength;
u4 length = ALIGN(bytelength, BLOCKSIZE) / BLOCKSIZE;
+ // fprintf(stderr, "heap_allocate: 0x%lx (%ld) requested, 0x%lx (%ld) aligned\n", bytelength, bytelength, length * BLOCKSIZE, length * BLOCKSIZE);
+
+ // heap_docollect();
+
intsDisable(); /* schani */
memlist_getsuitable (&freestart, &freelength, length);