#include "../threads/thread.h" /* schani */
#include "../threads/locks.h"
+#include "../sysdep/threads.h"
if ( isbitclear(startbits, blocknum) ) return;
if ( isbitset(markbits, blocknum) ) return;
- fprintf(stderr, "mark: marking object at 0x%lx\n", obj);
+ /* fprintf(stderr, "mark: marking object at 0x%lx\n", obj); */
setbit (markbits, blocknum);
if ( isbitclear(referencebits, blocknum) ) return;
******************************************************************************/
-static void markstack () /* schani */
+static void markstack ()
{
void *dummy;
for (aThread = liveThreads; aThread != 0;
aThread = CONTEXT(aThread).nextlive) {
mark((heapblock*)aThread);
- if (aThread == currentThread) {
- void **top_of_stack = &dummy;
-
- if (top_of_stack > (void**)CONTEXT(aThread).stackEnd)
- markreferences((void**)CONTEXT(aThread).stackEnd, top_of_stack);
- else
- markreferences(top_of_stack, (void**)CONTEXT(aThread).stackEnd);
- }
- else {
- if (CONTEXT(aThread).usedStackTop > CONTEXT(aThread).stackEnd)
- markreferences((void**)CONTEXT(aThread).stackEnd,
- (void**)CONTEXT(aThread).usedStackTop);
- else
- markreferences((void**)CONTEXT(aThread).usedStackTop,
- (void**)CONTEXT(aThread).stackEnd);
- }
+ if (CONTEXT(aThread).usedStackTop > CONTEXT(aThread).stackEnd)
+ markreferences((void**)CONTEXT(aThread).stackEnd,
+ (void**)CONTEXT(aThread).usedStackTop);
+ else
+ markreferences((void**)CONTEXT(aThread).usedStackTop,
+ (void**)CONTEXT(aThread).stackEnd);
}
markreferences((void**)&threadQhead[0],
#else
void **top_of_stack = &dummy;
- fprintf(stderr, "marking stack\n");
+ /* fprintf(stderr, "marking stack\n"); */
if (top_of_stack > bottom_of_stack)
markreferences(bottom_of_stack, top_of_stack);
/* Alle vom Stack referenzierten Objekte markieren */
asm_dumpregistersandcall (markstack);
- fprintf(stderr, "marking references\n");
+ /* fprintf(stderr, "marking references\n"); */
/* Alle von globalen Variablen erreichbaren Objekte markieren */
p = chain_first (allglobalreferences);
while (p) {
gc_call (void)
{
#ifdef USE_THREADS
+ u1 dummy;
+
assert(blockInts == 0);
intsDisable();
- if (currentThread == NULL || currentThread == mainThread)
+ if (currentThread == NULL || currentThread == mainThread) {
+ CONTEXT(mainThread).usedStackTop = &dummy;
heap_docollect();
+ }
else
- asm_switchstackandcall(CONTEXT(mainThread).usedStackTop, heap_docollect);
+ asm_switchstackandcall(CONTEXT(mainThread).usedStackTop, heap_docollect,
+ (void**)&(CONTEXT(currentThread).usedStackTop));
intsRestore();
#else
heap_docollect();
MFREE (startbits, bitfieldtype, heapsize/BITFIELDBITS);
MFREE (markbits, bitfieldtype, heapsize/BITFIELDBITS);
MFREE (referencebits, bitfieldtype, heapsize/BITFIELDBITS);
- chain_free (allglobalreferences);
+ if (allglobalreferences != NULL)
+ chain_free (allglobalreferences);
}
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);
+ /* fprintf(stderr, "heap_allocate: 0x%lx (%ld) requested, 0x%lx (%ld) aligned\n", bytelength, bytelength, length * BLOCKSIZE, length * BLOCKSIZE); */
- // heap_docollect();
+ /* heap_docollect(); */
intsDisable(); /* schani */