Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/59977b6c7cc81777dc6f8266c68945d1ab691aec

>---------------------------------------------------------------

commit 59977b6c7cc81777dc6f8266c68945d1ab691aec
Author: Simon Marlow <[email protected]>
Date:   Tue Mar 1 10:10:25 2011 +0000

    GHC.Prim.threadStatus# now returns the cap number, and the value of 
TSO_LOCKED

>---------------------------------------------------------------

 compiler/prelude/primops.txt.pp |    2 +-
 includes/mkDerivedConstants.c   |    1 +
 rts/PrimOps.cmm                 |   13 +++++++++++--
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/compiler/prelude/primops.txt.pp b/compiler/prelude/primops.txt.pp
index 525a837..777e83f 100644
--- a/compiler/prelude/primops.txt.pp
+++ b/compiler/prelude/primops.txt.pp
@@ -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
diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c
index 41cf1d7..b02b6c8 100644
--- a/includes/mkDerivedConstants.c
+++ b/includes/mkDerivedConstants.c
@@ -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);
diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm
index 7a7942a..701654a 100644
--- a/rts/PrimOps.cmm
+++ b/rts/PrimOps.cmm
@@ -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);
 }
 
 /* 
-----------------------------------------------------------------------------



_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to