Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/4b523bc139a05a52a58811623d638c43d398f245

>---------------------------------------------------------------

commit 4b523bc139a05a52a58811623d638c43d398f245
Author: Simon Marlow <marlo...@gmail.com>
Date:   Tue May 22 11:39:03 2012 +0100

    Don't remove the thread from interruptTargetThread on ^C (#6116)

>---------------------------------------------------------------

 compiler/utils/Panic.lhs |   33 ++++++++++++++++++---------------
 1 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/compiler/utils/Panic.lhs b/compiler/utils/Panic.lhs
index faaa628..38ee6fc 100644
--- a/compiler/utils/Panic.lhs
+++ b/compiler/utils/Panic.lhs
@@ -243,7 +243,7 @@ installSignalHandlers = do
       interrupt_exn = (toException UserInterrupt)
 
       interrupt = do
-        mt <- popInterruptTargetThread
+        mt <- peekInterruptTargetThread
         case mt of
           Nothing -> return ()
           Just t  -> throwTo t interrupt_exn
@@ -280,19 +280,18 @@ interruptTargetThread = unsafePerformIO (newMVar [])
 pushInterruptTargetThread :: ThreadId -> IO ()
 pushInterruptTargetThread tid = do
  wtid <- mkWeakThreadId tid
- modifyMVar_ interruptTargetThread $
-   return . (wtid :)
+ modifyMVar_ interruptTargetThread $ return . (wtid :)
 
-popInterruptTargetThread :: IO (Maybe ThreadId)
-popInterruptTargetThread =
-  modifyMVar interruptTargetThread $ loop
+peekInterruptTargetThread :: IO (Maybe ThreadId)
+peekInterruptTargetThread =
+  withMVar interruptTargetThread $ loop
  where
-   loop [] = return ([], Nothing)
+   loop [] = return Nothing
    loop (t:ts) = do
      r <- deRefWeak t
      case r of
        Nothing -> loop ts
-       Just t  -> return (ts, Just t)
+       Just t  -> return (Just t)
 #else
 {-# NOINLINE interruptTargetThread #-}
 interruptTargetThread :: MVar [ThreadId]
@@ -300,13 +299,17 @@ interruptTargetThread = unsafePerformIO (newMVar [])
 
 pushInterruptTargetThread :: ThreadId -> IO ()
 pushInterruptTargetThread tid = do
- modifyMVar_ interruptTargetThread $
-   return . (tid :)
+ modifyMVar_ interruptTargetThread $ return . (tid :)
 
-popInterruptTargetThread :: IO (Maybe ThreadId)
-popInterruptTargetThread =
-  modifyMVar interruptTargetThread $
-   \tids -> return $! case tids of [] -> ([], Nothing)
-                                   (t:ts) -> (ts, Just t)
+peekInterruptTargetThread :: IO (Maybe ThreadId)
+peekInterruptTargetThread =
+  withMVar interruptTargetThread $ return . listToMaybe
 #endif
+
+popInterruptTargetThread :: IO ()
+popInterruptTargetThread =
+  modifyMVar_ interruptTargetThread $
+   \tids -> return $! case tids of []     -> []
+                                   (t:ts) -> ts
+
 \end{code}



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to