From 5de5996013180243efbe6e4145b1d23eaebb8741 Mon Sep 17 00:00:00 2001 From: simonmar Date: Thu, 12 May 2005 11:11:58 +0000 Subject: [PATCH] [project @ 2005-05-12 11:11:58 by simonmar] 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 | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ghc/compiler/codeGen/CgForeignCall.hs b/ghc/compiler/codeGen/CgForeignCall.hs index 9897651..417c3c5 100644 --- a/ghc/compiler/codeGen/CgForeignCall.hs +++ b/ghc/compiler/codeGen/CgForeignCall.hs @@ -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 -- 1.7.10.4