diff options
author | Simon Marlow <simonmar@microsoft.com> | 2007-04-27 15:39:48 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2007-04-27 15:39:48 +0000 |
commit | 1e70478c73505fc3cfd414169cc85654411c8075 (patch) | |
tree | 3c076c057cc31954949c83eacb471d078542b051 | |
parent | 53c9c9f6d4ba6a533250566d4952c005af56fc74 (diff) | |
download | haskell-1e70478c73505fc3cfd414169cc85654411c8075.tar.gz |
outside of runStmt, if a breakpoint is hit then just print a message
-rw-r--r-- | compiler/main/GHC.hs | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/compiler/main/GHC.hs b/compiler/main/GHC.hs index 9c7dbafe02..7e5071b3f7 100644 --- a/compiler/main/GHC.hs +++ b/compiler/main/GHC.hs @@ -257,6 +257,7 @@ import HaddockParse import HaddockLex ( tokenise ) import Unique +import System.IO.Unsafe import Data.Array import Control.Concurrent import System.Directory ( getModificationTime, doesFileExist ) @@ -2196,11 +2197,10 @@ runStmt (Session ref) expr -- breakpoint this is visible in the Byte Code -- Interpreter, thus it is a global variable, -- implemented with stable pointers - stablePtr <- setBreakAction breakMVar statusMVar + withBreakAction breakMVar statusMVar $ do let thing_to_run = unsafeCoerce# hval :: IO [HValue] status <- sandboxIO statusMVar thing_to_run - freeStablePtr stablePtr -- be careful not to leak stable pointers! handleRunStatus ref new_IC names (hsc_IC hsc_env) breakMVar statusMVar status @@ -2245,14 +2245,25 @@ sandboxIO statusMVar thing = do putMVar interruptTargetThread (child:ts) takeMVar statusMVar `finally` modifyMVar_ interruptTargetThread (return.tail) -setBreakAction breakMVar statusMVar = do - stablePtr <- newStablePtr onBreak - poke breakPointIOAction stablePtr - return stablePtr - where onBreak ids apStack = do - tid <- myThreadId - putMVar statusMVar (Break apStack ids tid) - takeMVar breakMVar +withBreakAction breakMVar statusMVar io + = bracket setBreakAction resetBreakAction (\_ -> io) + where + setBreakAction = do + stablePtr <- newStablePtr onBreak + poke breakPointIOAction stablePtr + return stablePtr + + onBreak info apStack = do + tid <- myThreadId + putMVar statusMVar (Break apStack info tid) + takeMVar breakMVar + + resetBreakAction stablePtr = do + poke breakPointIOAction noBreakStablePtr + freeStablePtr stablePtr + +noBreakStablePtr = unsafePerformIO $ newStablePtr noBreakAction +noBreakAction info apStack = putStrLn "*** Ignoring breakpoint" resume :: Session -> ResumeHandle -> IO RunResult resume (Session ref) res@(ResumeHandle breakMVar statusMVar @@ -2266,10 +2277,9 @@ resume (Session ref) res@(ResumeHandle breakMVar statusMVar writeIORef ref hsc_env{ hsc_IC = resume_ic } Linker.deleteFromLinkEnv names - stablePtr <- setBreakAction breakMVar statusMVar + withBreakAction breakMVar statusMVar $ do putMVar breakMVar () -- this awakens the stopped thread... status <- takeMVar statusMVar -- and wait for the result - freeStablePtr stablePtr -- be careful not to leak stable pointers! handleRunStatus ref final_ic final_names resume_ic breakMVar statusMVar status |