MERGE: Fix a few uses of the wrong return convention for the scheduler
authorSimon Marlow <simonmar@microsoft.com>
Mon, 16 Apr 2007 14:19:02 +0000 (14:19 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Mon, 16 Apr 2007 14:19:02 +0000 (14:19 +0000)
We changed the convention a while ago so that BaseReg is returned to
the scheduler in R1, because BaseReg may change during the run of a
thread, e.g. during a foreign call.  A few places got missed,
mostly for very rare events.

Should fix concprog001, although I'm not able to reliably reproduce
the failure.

includes/StgMiscClosures.h
rts/Exception.cmm
rts/PrimOps.cmm
rts/StgStartup.cmm

index 72a7b55..8267128 100644 (file)
@@ -484,6 +484,7 @@ RTS_FUN(stg_returnToStackTop);
 RTS_FUN(stg_returnToSched);
 RTS_FUN(stg_returnToSchedNotPaused);
 RTS_FUN(stg_returnToSchedButFirst);
 RTS_FUN(stg_returnToSched);
 RTS_FUN(stg_returnToSchedNotPaused);
 RTS_FUN(stg_returnToSchedButFirst);
+RTS_FUN(stg_threadFinished);
 
 RTS_FUN(stg_init_finish);
 RTS_FUN(stg_init);
 
 RTS_FUN(stg_init_finish);
 RTS_FUN(stg_init);
index ce2ea27..8ed83b3 100644 (file)
@@ -84,8 +84,7 @@ INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret,
 
         if (r != 0::CInt) {
             if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
 
         if (r != 0::CInt) {
             if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
-                R1 = ThreadFinished;
-                jump StgReturn;
+                jump stg_threadFinished;
             } else {
                 LOAD_THREAD_STATE();
                 ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
             } else {
                 LOAD_THREAD_STATE();
                 ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
@@ -180,8 +179,7 @@ unblockAsyncExceptionszh_fast
 
             if (r != 0::CInt) {
                 if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
 
             if (r != 0::CInt) {
                 if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
-                   R1 = ThreadFinished;
-                   jump StgReturn;
+                    jump stg_threadFinished;
                } else {
                    LOAD_THREAD_STATE();
                    ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
                } else {
                    LOAD_THREAD_STATE();
                    ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
@@ -229,8 +227,7 @@ killThreadzh_fast
        foreign "C" throwToSingleThreaded(MyCapability() "ptr", 
                                          target "ptr", exception "ptr")[R1,R2];
        if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
        foreign "C" throwToSingleThreaded(MyCapability() "ptr", 
                                          target "ptr", exception "ptr")[R1,R2];
        if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
-           R1 = ThreadFinished;
-           jump StgReturn;
+            jump stg_threadFinished;
        } else {
            LOAD_THREAD_STATE();
            ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
        } else {
            LOAD_THREAD_STATE();
            ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
@@ -431,11 +428,7 @@ retry_pop_stack:
        StgTSO_what_next(CurrentTSO) = ThreadKilled::I16;
        SAVE_THREAD_STATE();    /* inline! */
 
        StgTSO_what_next(CurrentTSO) = ThreadKilled::I16;
        SAVE_THREAD_STATE();    /* inline! */
 
-       /* The return code goes in BaseReg->rRet, and BaseReg is returned in R1 */
-       StgRegTable_rRet(BaseReg) = ThreadFinished;
-       R1 = BaseReg;
-
-       jump StgReturn;
+        jump stg_threadFinished;
     }
 
     /* Ok, Sp points to the enclosing CATCH_FRAME or CATCH_STM_FRAME.  Pop everything
     }
 
     /* Ok, Sp points to the enclosing CATCH_FRAME or CATCH_STM_FRAME.  Pop everything
index 437ce55..31f58d1 100644 (file)
@@ -2142,8 +2142,7 @@ noDuplicatezh_fast
     foreign "C" threadPaused (MyCapability() "ptr", CurrentTSO "ptr") [];
     
     if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
     foreign "C" threadPaused (MyCapability() "ptr", CurrentTSO "ptr") [];
     
     if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
-        R1 = ThreadFinished;
-        jump StgReturn;
+        jump stg_threadFinished;
     } else {
         LOAD_THREAD_STATE();
         ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
     } else {
         LOAD_THREAD_STATE();
         ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
index 33345cf..2d83a67 100644 (file)
@@ -128,6 +128,13 @@ stg_returnToSchedButFirst
   jump R2;
 }
 
   jump R2;
 }
 
+stg_threadFinished
+{
+  StgRegTable_rRet(BaseReg) = ThreadFinished;
+  R1 = BaseReg;
+  jump StgReturn;
+}  
+
 /* -----------------------------------------------------------------------------
     Strict IO application - performing an IO action and entering its result.
     
 /* -----------------------------------------------------------------------------
     Strict IO application - performing an IO action and entering its result.