From eb8bc6e827389948ecdee37d571c02e1ede90bdc Mon Sep 17 00:00:00 2001 From: cacao Date: Fri, 30 Oct 1998 19:21:05 +0000 Subject: [PATCH] correct version of heap.old.c reestablished --- mm/heap.old.c | 174 ++++++++++++++++++++------------------------------ 1 file changed, 70 insertions(+), 104 deletions(-) diff --git a/mm/heap.old.c b/mm/heap.old.c index 73ec5013e..478e40b22 100644 --- a/mm/heap.old.c +++ b/mm/heap.old.c @@ -455,40 +455,54 @@ static void markreferences (void **rstart, void **rend) static void markstack () /* schani */ { void *dummy; - void **top_of_stack = &dummy; #ifdef USE_THREADS - thread *aThread; - - for (aThread = liveThreads; aThread != 0; aThread = CONTEXT(aThread).nextlive) { - mark((heapblock*)aThread); - if (aThread == currentThread) { - 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); + thread *aThread; + + if (currentThread == NULL) { + void **top_of_stack = &dummy; + + if (top_of_stack > bottom_of_stack) + markreferences(bottom_of_stack, top_of_stack); + else + markreferences(top_of_stack, bottom_of_stack); + } + else { + 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 + 16); - else - markreferences ((void**)CONTEXT(aThread).usedStackTop - 16, - (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); } - } + } - markreferences((void**)&threadQhead[0], (void**)&threadQhead[MAX_THREAD_PRIO]); + markreferences((void**)&threadQhead[0], + (void**)&threadQhead[MAX_THREAD_PRIO]); + } #else - if (top_of_stack > bottom_of_stack) - markreferences(bottom_of_stack, top_of_stack); - else - markreferences(top_of_stack, bottom_of_stack); + void **top_of_stack = &dummy; + + if (top_of_stack > bottom_of_stack) + markreferences(bottom_of_stack, top_of_stack); + else + markreferences(top_of_stack, bottom_of_stack); #endif } - /**************** Funktion: searchlivefinalizees ***************************** geht die Liste aller Objekte durch, die noch finalisiert werden m"ussen @@ -657,83 +671,36 @@ static void heap_docollect () /************************* Function: gc_init ********************************** - Initializes the garbage collection thread mechanism. + Initializes anything that must be initialized to call the gc on the right + stack. ******************************************************************************/ -#ifdef USE_THREADS -iMux gcStartMutex; -iMux gcThreadMutex; -iCv gcConditionStart; -iCv gcConditionDone; - -void -gc_init (void) -{ - gcStartMutex.holder = 0; - gcStartMutex.count = 0; - gcStartMutex.muxWaiters = 0; - - gcThreadMutex.holder = 0; - gcThreadMutex.count = 0; - gcThreadMutex.muxWaiters = 0; - - gcConditionStart.cvWaiters = 0; - gcConditionStart.mux = 0; - - gcConditionDone.cvWaiters = 0; - gcConditionDone.mux = 0; -} -#else void gc_init (void) { } -#endif -/************************* Function: gc_thread ******************************** +/************************** Function: gc_call ******************************** - In an endless loop waits for a condition to be posted, then - garbage collects the heap. + Calls the garbage collector. The garbage collector should always be called + using this function since it ensures that enough stack space is available. ******************************************************************************/ -#ifdef USE_THREADS -void -gc_thread (void) -{ - intsRestore(); /* all threads start with interrupts disabled */ - - assert(blockInts == 0); - - lock_mutex(&gcThreadMutex); - - for (;;) - { - wait_cond(&gcThreadMutex, &gcConditionStart, 0); - - intsDisable(); - heap_docollect(); - intsRestore(); - - signal_cond(&gcConditionDone); - } -} -#endif - void gc_call (void) { #ifdef USE_THREADS - lock_mutex(&gcThreadMutex); - - signal_cond(&gcConditionStart); - wait_cond(&gcThreadMutex, &gcConditionDone, 0); - - unlock_mutex(&gcThreadMutex); -#else - heap_docollect(); + assert(blockInts == 0); #endif + + intsDisable(); + if (currentThread == NULL || currentThread == mainThread) + heap_docollect(); + else + asm_switchstackandcall(CONTEXT(mainThread).usedStackTop, heap_docollect); + intsRestore(); } @@ -855,41 +822,40 @@ void *heap_allocate (u4 bytelength, bool references, methodinfo *finalizer) memlist_getsuitable (&freestart, &freelength, length); +onemoretry: if (!freelength) { - if ( (topofheap+length > collectthreashold) || (topofheap+length > heapsize) ) { + if ((topofheap+length > collectthreashold) || + (topofheap+length > heapsize)) { + intsRestore(); gc_call(); intsDisable(); - + memlist_getsuitable (&freestart, &freelength, length); - if (freelength) - goto have_block; /* phil */ - } + if (freelength) goto onemoretry; + } if (topofheap+length > heapsize) { sprintf (logtext, "Heap-Allocation failed for %d bytes", - (int) bytelength); + (int) bytelength); dolog(); intsRestore(); /* schani */ return NULL; - } + } freestart = topofheap; freelength = length; setbit (startbits, topofheap); topofheap += length; - } - - have_block: - if (freelength>length) { - setbit (startbits, freestart+length); - memlist_addrange (freestart+length, freelength-length); - } + } + else { + if (freelength>length) { + setbit (startbits, freestart+length); + memlist_addrange (freestart+length, freelength-length); + } + } - if (references) - setbit (referencebits, freestart); - - setbit (startbits, freestart); /* phil */ + if (references) setbit (referencebits, freestart); heapfillgrade += length; @@ -899,14 +865,14 @@ void *heap_allocate (u4 bytelength, bool references, methodinfo *finalizer) n -> objstart = freestart; n -> finalizer = finalizer; livefinalizees = n; - } + } intsRestore(); /* schani */ if (runverbose) { sprintf (logtext, "new returns: %lx", (long) (heap + freestart)); dolog (); - } + } return (void*) (heap + freestart); } -- 2.25.1