GHC.Prim.threadStatus# now returns the cap number, and the value of TSO_LOCKED
authorSimon Marlow <marlowsd@gmail.com>
Tue, 1 Mar 2011 10:10:25 +0000 (10:10 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 1 Mar 2011 10:10:25 +0000 (10:10 +0000)
compiler/prelude/primops.txt.pp
includes/mkDerivedConstants.c
rts/PrimOps.cmm

index 525a837..777e83f 100644 (file)
@@ -1449,7 +1449,7 @@ primop  NoDuplicateOp "noDuplicate#" GenPrimOp
    has_side_effects = True
 
 primop  ThreadStatusOp "threadStatus#" GenPrimOp
-   ThreadId# -> State# RealWorld -> (# State# RealWorld, Int# #)
+   ThreadId# -> State# RealWorld -> (# State# RealWorld, Int#, Int#, Int# #)
    with
    out_of_line = True
    has_side_effects = True
index 41cf1d7..b02b6c8 100644 (file)
@@ -234,6 +234,7 @@ main(int argc, char *argv[])
 
     field_offset(Capability, r);
     field_offset(Capability, lock);
+    struct_field(Capability, no);
     struct_field(Capability, mut_lists);
     struct_field(Capability, context_switch);
     struct_field(Capability, sparks);
index 7a7942a..701654a 100644 (file)
@@ -631,7 +631,7 @@ stg_threadStatuszh
     W_ tso;
     W_ why_blocked;
     W_ what_next;
-    W_ ret;
+    W_ ret, cap, locked;
 
     tso = R1;
 
@@ -651,7 +651,16 @@ stg_threadStatuszh
             ret = why_blocked;
         }
     }
-    RET_N(ret);
+
+    cap = TO_W_(Capability_no(StgTSO_cap(tso)));
+
+    if ((TO_W_(StgTSO_flags(tso)) & TSO_LOCKED) != 0) {
+        locked = 1;
+    } else {
+        locked = 0;
+    }
+
+    RET_NNN(ret,cap,locked);
 }
 
 /* -----------------------------------------------------------------------------