packages feed

hpc-tracer-0.3.0: src/BreakPoint.hs

module BreakPoint where

import Common
import TixActor 
import Data.List
import qualified Data.Set as Set
import Data.Set (Set)

setBreakPoint   :: BreakPoint -> BreakPoints -> BreakPoints
setBreakPoint bp bps 
  | bp `elem` bps = bps
  | otherwise     = bps ++ [bp]
clearBreakPoint :: BreakPoint -> BreakPoints -> BreakPoints
clearBreakPoint bp bps = filter (/= bp) bps

-- This is where we lookup the module, local tick number, 
-- at turn it into a complete tick info structure.

normalizeBreakPoint :: TixActor -> BreakPoint -> IO BreakPoint
normalizeBreakPoint tixActor (ReqTickBox modName localTickId) = do
     tickInfo <- lookupLocalTickInfo tixActor modName localTickId
     return $ TickBox tickInfo
normalizeBreakPoint tixActor other = return $ other

isBreakPoint :: TracerState -> Bool
isBreakPoint = or . checkBreakPoints

checkBreakPoints :: TracerState -> [Bool]
checkBreakPoints state = map isBP (tracerBreakPoints state)
  where
     counter = tracerCounter state
     isBP (CounterAt count) = counter == count
     isBP (AllExceptions)   = case tracerEvent state of
     	  		        Raise -> True
				_ -> False
{-
     isBP (ThreadChange)    = case tracerEvent state of
     	  		        Thread {} -> True
				_ -> False
     isBP (ThreadChangeTo id1) 
     	  		     = case tracerEvent state of
     	  		        Thread id2 -> id1 == id2
				_ -> False
-}
     isBP (ThreadTermination)
			    = case tracerEvent state of
     	  		        ThreadFinished -> True
				_ -> False
     isBP (TickBox info)    = case tracerEvent state of
     	  		        Tick i -> i == tbiGlobalTickNo info
				_ -> False

     isBP _                 = False



nextCounterBreakPoint :: TracerState -> Maybe Integer
nextCounterBreakPoint state =
    case counter_bps of
      [] -> Nothing
      (n:_) -> Just n
  where
    counter_bps = sort 
                    [ n | CounterAt n <- tracerBreakPoints state
		          -- must be in the future
    	      	        , n > tracerCounter state
		    ]


tickIdBreakPointSet :: TracerState -> Set GlobalTickId
tickIdBreakPointSet state = Set.unions $
   [ Set.singleton (tbiGlobalTickNo info) | TickBox info <- tracerBreakPoints state ]