Fixed a threads/gc bug.
authorschani <none@none>
Thu, 19 Nov 1998 13:25:46 +0000 (13:25 +0000)
committerschani <none@none>
Thu, 19 Nov 1998 13:25:46 +0000 (13:25 +0000)
alpha/asmpart.c
alpha/threads.h
mm/heap.old.c
src/threads/green/threads.c
threads/thread.c

index d14e67f6a956c8a09dcf15373195a234540c2867..3fbde67348733087934c078d08d4ce3501162bf5 100644 (file)
@@ -946,11 +946,12 @@ perform_alpha_threadswitch:
 
 /********************* function asm_switchstackandcall *************************
 *                                                                              *
-*   void asm_switchstackandcall (void *stack, void *func);                     *
+*  void asm_switchstackandcall (void *stack, void *func, void **stacktopsave); *
 *                                                                              *
 *   Switches to a new stack, calls a function and switches back.               *
 *       a0      new stack pointer                                              *
 *       a1      function pointer                                               *
+*              a2              pointer to variable where stack top should be stored           *
 *                                                                              *
 *******************************************************************************/
 
@@ -958,12 +959,13 @@ perform_alpha_threadswitch:
        .ent    asm_switchstackandcall
 asm_switchstackandcall:
        lda     a0,-2*8(a0)             /* allocate new stack                                 */
-       stq     ra,0(a0)                /* save return address                                */
-       stq     sp,1*8(a0)              /* save old stack pointer                             */
+       stq     ra,0(a0)                /* save return address on new stack                   */
+       stq     sp,1*8(a0)              /* save old stack pointer on new stack                */
+       stq sp,0(a2)            /* save old stack pointer to variable                 */
        mov     a0,sp                   /* switch to new stack                                */
        
        mov     a1,pv                   /* load function pointer                              */
-       jmp     ra,(pv)                 /* and call funciton                                  */
+       jmp     ra,(pv)                 /* and call function                                  */
 
        ldq     ra,0(sp)                /* load return address                                */
        ldq     sp,1*8(sp)              /* switch to old stack                                */
index 52ad08b7b6383c0fa2b95700fc7e804b2ab4d314..72f8c577c93fd4d84d9460b343c1ec9e8ee5566f 100644 (file)
@@ -25,7 +25,7 @@
 
 void perform_alpha_threadswitch (u1 **from, u1 **to, u1 **stackTop);
 u1* initialize_thread_stack (void *func, u1 *stack);
-void asm_switchstackandcall (void *stack, void *func);
+void asm_switchstackandcall (void *stack, void *func, void **stacktopsave);
 
 #define        THREADSTACKSIZE         (32 * 1024)
 
index a9172740b36cd429918ffda9e9141272b767457a..dd1feacb97e41ca2b6cf2a9a9cb109af04681ae9 100644 (file)
@@ -454,7 +454,7 @@ static void markreferences (void **rstart, void **rend)
 
 ******************************************************************************/
 
-static void markstack ()                   /* schani */
+static void markstack ()
 {
        void *dummy;
 
@@ -473,22 +473,12 @@ static void markstack ()                   /* schani */
                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],
@@ -709,13 +699,18 @@ void
 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();
index 97e18c11f743a4b1213351e506ba0f8a8a48f5ff..851e2f9ac8dce5443f1b66a6196561648af2d588 100644 (file)
@@ -174,6 +174,8 @@ initThreads(u1 *stackbottom)
 
     mainThread = currentThread = the_main_thread;
 
+       heap_addreference((void**)&mainThread);
+
        /* Add thread into runQ */
        iresumeThread(mainThread);
 
index 97e18c11f743a4b1213351e506ba0f8a8a48f5ff..851e2f9ac8dce5443f1b66a6196561648af2d588 100644 (file)
@@ -174,6 +174,8 @@ initThreads(u1 *stackbottom)
 
     mainThread = currentThread = the_main_thread;
 
+       heap_addreference((void**)&mainThread);
+
        /* Add thread into runQ */
        iresumeThread(mainThread);