[project @ 2005-05-12 11:11:58 by simonmar]
authorsimonmar <unknown>
Thu, 12 May 2005 11:11:58 +0000 (11:11 +0000)
committersimonmar <unknown>
Thu, 12 May 2005 11:11:58 +0000 (11:11 +0000)
SMP: we need to assign the result of resumeThread to BaseReg, because
we might now have a new Capability.  (this was an interesting bug to find...)

ghc/compiler/codeGen/CgForeignCall.hs

index 9897651..417c3c5 100644 (file)
@@ -32,7 +32,7 @@ import MachOp
 import SMRep
 import ForeignCall
 import Constants
-import StaticFlags     ( opt_SccProfilingOn )
+import StaticFlags     ( opt_SccProfilingOn, opt_SMP )
 import Outputable
 
 import Monad           ( when )
@@ -78,13 +78,20 @@ emitForeignCall results (CCall (CCallSpec target cconv safety)) args live
     vols <- getVolatileRegs live
     id <- newTemp wordRep
     emitSaveThreadState
-    stmtC (CmmCall (CmmForeignCall suspendThread CCallConv) [(id,NoHint)]
+    stmtC (CmmCall (CmmForeignCall suspendThread CCallConv) 
+                       [(id,NoHint)]
                        [ (CmmReg (CmmGlobal BaseReg), PtrHint) ] 
                        (Just vols)
                        )
     stmtC (the_call vols)
-    stmtC (CmmCall (CmmForeignCall resumeThread CCallConv) []
-                       [ (CmmReg id, NoHint) ] (Just vols)
+    stmtC (CmmCall (CmmForeignCall resumeThread CCallConv) 
+                       (if opt_SMP then [(CmmGlobal BaseReg, PtrHint)] else [])
+                               -- Assign the result to BaseReg: we might now have
+                               -- a different Capability!  Small optimisation:
+                               -- only do this in SMP mode, where there are >1
+                               -- Capabilities.
+                       [ (CmmReg id, NoHint) ]
+                       (Just vols)
                        )
     emitLoadThreadState