Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 93f6a6c

Browse files
detect blocked stm transaction in the trivial case
1 parent 23d26a3 commit 93f6a6c

File tree

1 file changed

+20
-13
lines changed
  • external-stg-interpreter/lib/Stg/Interpreter/PrimOp

1 file changed

+20
-13
lines changed

‎external-stg-interpreter/lib/Stg/Interpreter/PrimOp/STM.hs‎

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Data.Maybe
1414

1515
import Stg.Syntax
1616
import Stg.Interpreter.Base
17+
import qualified Stg.Interpreter.PrimOp.Concurrency as PrimConcurrency
1718

1819
{-
1920
STM design notes
@@ -335,25 +336,31 @@ retrySTM = unwindStack where
335336
putStrLn $ "[STM] tid: " ++ show tid ++ " tlog: " ++ show tlog
336337
putStrLn $ "[STM] validateTLog: " ++ show isValid
337338

338-
if isValid
339+
if (notisValid)
339340
then do
341+
restartTransaction stmAction
342+
else do
340343
promptM $ putStrLn $ "[STM] retry, block thread, tid: " ++ show tid
341344
tid <- gets ssCurrentThreadId
342345
ts <- getThreadState tid
343346
-- subscribe to wait queues
344347
let Just tlog = tsActiveTLog ts
345-
when (IntMap.size tlog == 0) $ error "internal error: IntMap.sie tlog == 0 on BlockedOnSTM"
346-
subscribeTVarWaitQueues tid tlog
347-
-- suspend thread
348-
updateThreadState tid (ts {tsStatus = ThreadBlocked (BlockedOnSTM tlog), tsActiveTLog = Just mempty})
349-
-- Q: who will update the tsTLog after the wake up?
350-
stackPush $ Atomically stmAction
351-
stackPush $ Apply [Void]
352-
stackPush $ RunScheduler SR_ThreadBlocked
353-
pure [stmAction]
354-
355-
else do
356-
restartTransaction stmAction
348+
case IntMap.null tlog of
349+
True -> do
350+
-- HINT: the transaction log is empty, so there is no TVar to subscribe, therefore the transaction is blocked indefinitely
351+
updateThreadState tid (ts {tsActiveTLog = Nothing})
352+
Rts{..} <- gets ssRtsSupport
353+
PrimConcurrency.raiseAsyncEx [] tid rtsBlockedIndefinitelyOnSTM
354+
pure []
355+
False -> do
356+
subscribeTVarWaitQueues tid tlog
357+
-- suspend thread
358+
updateThreadState tid (ts {tsStatus = ThreadBlocked (BlockedOnSTM tlog), tsActiveTLog = Just mempty})
359+
-- Q: who will update the tsTLog after the wake up?
360+
stackPush $ Atomically stmAction
361+
stackPush $ Apply [Void]
362+
stackPush $ RunScheduler SR_ThreadBlocked
363+
pure [stmAction]
357364

358365
_ -> unwindStack -- HINT: discard stack frames
359366

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /