module GHC.RTS.Events.Analysis.Thread ( ThreadState (..) , threadMachine ) where import GHC.RTS.Events import GHC.RTS.Events.Analysis -------------------------------------------------------------------------------- -- | This datatype defines the state machine for a single thread. data ThreadState = ThreadInitial | ThreadQueued | ThreadRunning | ThreadStopped | ThreadFinal deriving (Show, Eq, Ord) -- | This state machine tracks the events processed by a thread. threadMachine :: Machine ThreadState EventInfo threadMachine = Machine { initial = ThreadInitial , final = threadFinal , alpha = threadAlpha , delta = threadDelta } where threadFinal ThreadFinal = True threadFinal _ = False threadAlpha (CreateThread _) = True threadAlpha (RunThread _) = True threadAlpha (StopThread _ _) = True threadAlpha (WakeupThread _ _) = True threadAlpha _ = False -- ThreadInitial threadDelta ThreadInitial (CreateThread _) = Just ThreadQueued -- ThreadQueued threadDelta ThreadQueued (RunThread _) = Just ThreadRunning threadDelta ThreadQueued (WakeupThread _ _) = Just ThreadQueued -- ThreadRunning threadDelta ThreadRunning (StopThread _ StackOverflow) = Just ThreadQueued threadDelta ThreadRunning (StopThread _ HeapOverflow) = Just ThreadQueued threadDelta ThreadRunning (StopThread _ ForeignCall) = Just ThreadQueued threadDelta ThreadRunning (StopThread _ ThreadFinished) = Just ThreadFinal threadDelta ThreadRunning (StopThread _ _) = Just ThreadStopped -- ThreadStopped threadDelta ThreadStopped (RunThread _) = Just ThreadRunning threadDelta ThreadStopped (WakeupThread _ _) = Just ThreadQueued -- Unknown threadDelta _ _ = Nothing