[project @ 2005-12-15 11:17:31 by simonmar]
[haskell-directory.git] / GHC / IOBase.lhs
index 0a3cfca..112268e 100644 (file)
@@ -30,7 +30,7 @@ module GHC.IOBase(
        -- Handles, file descriptors,
     FilePath,  
     Handle(..), Handle__(..), HandleType(..), IOMode(..), FD, 
-    isReadableHandleType, isWritableHandleType, showHandle,
+    isReadableHandleType, isWritableHandleType, isReadWriteHandleType, showHandle,
   
        -- Buffers
     Buffer(..), RawBuffer, BufferState(..), BufferList(..), BufferMode(..),
@@ -423,6 +423,9 @@ isWritableHandleType WriteHandle     = True
 isWritableHandleType ReadWriteHandle = True
 isWritableHandleType _              = False
 
+isReadWriteHandleType ReadWriteHandle{} = True
+isReadWriteHandleType _                 = False
+
 -- | File and directory names are values of type 'String', whose precise
 -- meaning is operating system dependent. Files can be opened, yielding a
 -- handle which can then be used to operate on the contents of that file.
@@ -599,6 +602,10 @@ data Exception
        -- ^The current thread was waiting to retry an atomic memory transaction
        -- that could never become possible to complete because there are no other
        -- threads referring to any of teh TVars involved.
+  | NestedAtomically
+       -- ^The runtime detected an attempt to nest one STM transaction
+       -- inside another one, presumably due to the use of 
+       -- 'unsafePeformIO' with 'atomically'.
   | Deadlock
        -- ^There are no runnable threads, so the program is
        -- deadlocked.  The 'Deadlock' exception is
@@ -737,6 +744,7 @@ instance Show Exception where
   showsPrec _ (AsyncException e)        = shows e
   showsPrec _ (BlockedOnDeadMVar)       = showString "thread blocked indefinitely"
   showsPrec _ (BlockedIndefinitely)     = showString "thread blocked indefinitely"
+  showsPrec _ (NestedAtomically)        = showString "Control.Concurrent.STM.atomically was nested"
   showsPrec _ (NonTermination)           = showString "<<loop>>"
   showsPrec _ (Deadlock)                 = showString "<<deadlock>>"
 
@@ -756,6 +764,7 @@ instance Eq Exception where
   AsyncException e1   == AsyncException e2   = e1 == e2
   BlockedOnDeadMVar   == BlockedOnDeadMVar   = True
   NonTermination      == NonTermination      = True
+  NestedAtomically    == NestedAtomically    = True
   Deadlock            == Deadlock            = True
   _                   == _                   = False