rts_evalStableIO: start the new thread in blocked mode
[ghc-hetmet.git] / rts / PrimOps.cmm
index c2b53f9..e8b216f 100644 (file)
@@ -1551,7 +1551,7 @@ takeMVarzh_fast
 #endif
         
     if (info == stg_MVAR_CLEAN_info) {
-        foreign "C" dirty_MVAR(BaseReg "ptr", mvar "ptr");
+        foreign "C" dirty_MVAR(BaseReg "ptr", mvar "ptr") [];
     }
 
     /* If the MVar is empty, put ourselves on its blocking queue,
@@ -1561,14 +1561,16 @@ takeMVarzh_fast
        if (StgMVar_head(mvar) == stg_END_TSO_QUEUE_closure) {
            StgMVar_head(mvar) = CurrentTSO;
        } else {
-            foreign "C" setTSOLink(MyCapability() "ptr", StgMVar_tail(mvar),
-                                   CurrentTSO);
+            foreign "C" setTSOLink(MyCapability() "ptr", 
+                                   StgMVar_tail(mvar) "ptr",
+                                   CurrentTSO) [];
        }
        StgTSO__link(CurrentTSO)       = stg_END_TSO_QUEUE_closure;
        StgTSO_why_blocked(CurrentTSO) = BlockedOnMVar::I16;
        StgTSO_block_info(CurrentTSO)  = mvar;
        StgMVar_tail(mvar) = CurrentTSO;
        
+        R1 = mvar;
        jump stg_block_takemvar;
   }
 
@@ -1586,8 +1588,8 @@ takeMVarzh_fast
       tso = StgMVar_head(mvar);
       PerformPut(tso,StgMVar_value(mvar));
 
-      if (StgTSO_flags(tso) & TSO_DIRTY == 0) {
-          foreign "C" dirty_TSO(MyCapability(), tso);
+      if (TO_W_(StgTSO_flags(tso)) & TSO_DIRTY == 0) {
+          foreign "C" dirty_TSO(MyCapability() "ptr", tso "ptr") [];
       }
 
       ("ptr" tso) = foreign "C" unblockOne_(MyCapability() "ptr", 
@@ -1662,8 +1664,8 @@ tryTakeMVarzh_fast
        /* actually perform the putMVar for the thread that we just woke up */
        tso = StgMVar_head(mvar);
        PerformPut(tso,StgMVar_value(mvar));
-        if (StgTSO_flags(tso) & TSO_DIRTY == 0) {
-            foreign "C" dirty_TSO(MyCapability(), tso);
+        if (TO_W_(StgTSO_flags(tso)) & TSO_DIRTY == 0) {
+            foreign "C" dirty_TSO(MyCapability() "ptr", tso "ptr") [];
         }
 
         ("ptr" tso) = foreign "C" unblockOne_(MyCapability() "ptr", 
@@ -1696,13 +1698,14 @@ tryTakeMVarzh_fast
 
 putMVarzh_fast
 {
-    W_ mvar, info, tso;
+    W_ mvar, val, info, tso;
 
     /* args: R1 = MVar, R2 = value */
     mvar = R1;
+    val  = R2;
 
 #if defined(THREADED_RTS)
-    ("ptr" info) = foreign "C" lockClosure(mvar "ptr") [R2];
+    ("ptr" info) = foreign "C" lockClosure(mvar "ptr") [];
 #else
     info = GET_INFO(mvar);
 #endif
@@ -1715,14 +1718,17 @@ putMVarzh_fast
        if (StgMVar_head(mvar) == stg_END_TSO_QUEUE_closure) {
            StgMVar_head(mvar) = CurrentTSO;
        } else {
-            foreign "C" setTSOLink(MyCapability() "ptr", StgMVar_tail(mvar),
-                                   CurrentTSO);
+            foreign "C" setTSOLink(MyCapability() "ptr", 
+                                   StgMVar_tail(mvar) "ptr",
+                                   CurrentTSO) [];
        }
        StgTSO__link(CurrentTSO)       = stg_END_TSO_QUEUE_closure;
        StgTSO_why_blocked(CurrentTSO) = BlockedOnMVar::I16;
        StgTSO_block_info(CurrentTSO)  = mvar;
        StgMVar_tail(mvar) = CurrentTSO;
        
+        R1 = mvar;
+        R2 = val;
        jump stg_block_putmvar;
     }
   
@@ -1735,8 +1741,8 @@ putMVarzh_fast
        /* actually perform the takeMVar */
        tso = StgMVar_head(mvar);
        PerformTake(tso, R2);
-        if (StgTSO_flags(tso) & TSO_DIRTY == 0) {
-            foreign "C" dirty_TSO(MyCapability(), tso);
+        if (TO_W_(StgTSO_flags(tso)) & TSO_DIRTY == 0) {
+            foreign "C" dirty_TSO(MyCapability() "ptr", tso "ptr") [];
         }
       
         ("ptr" tso) = foreign "C" unblockOne_(MyCapability() "ptr", 
@@ -1804,8 +1810,8 @@ tryPutMVarzh_fast
        /* actually perform the takeMVar */
        tso = StgMVar_head(mvar);
        PerformTake(tso, R2);
-        if (StgTSO_flags(tso) & TSO_DIRTY == 0) {
-            foreign "C" dirty_TSO(MyCapability(), tso);
+        if (TO_W_(StgTSO_flags(tso)) & TSO_DIRTY == 0) {
+            foreign "C" dirty_TSO(MyCapability() "ptr", tso "ptr") [];
         }
       
         ("ptr" tso) = foreign "C" unblockOne_(MyCapability() "ptr", 
@@ -2030,7 +2036,7 @@ for2:
     if (W_[blocked_queue_hd] == END_TSO_QUEUE) {       \
       W_[blocked_queue_hd] = tso;                      \
     } else {                                           \
-      foreign "C" setTSOLink(MyCapability() "ptr", W_[blocked_queue_tl], tso); \
+      foreign "C" setTSOLink(MyCapability() "ptr", W_[blocked_queue_tl] "ptr", tso) []; \
     }                                                  \
     W_[blocked_queue_tl] = tso;
 
@@ -2134,7 +2140,7 @@ while:
     if (prev == NULL) {
        W_[sleeping_queue] = CurrentTSO;
     } else {
-        foreign "C" setTSOLink(MyCapability() "ptr", prev, CurrentTSO) [];
+        foreign "C" setTSOLink(MyCapability() "ptr", prev "ptr", CurrentTSO) [];
     }
     jump stg_block_noregs;
 #endif