content: import Control.Exception
  import Control.Concurrent
  import Text.Printf
  
  -- Test combinations of nesting mask/uninterruptibleMask with
  -- forkIO/forkIOWithUnmask
  
  main = do
    m <- newEmptyMVar
    t1 <- mask_ $ forkIO $ do
            takeMVar m `catch` \e -> do stat 1 MaskedInterruptible
                                        print (e::SomeException)
                                        throwIO e
    killThread t1
    t2 <- uninterruptibleMask_ $ forkIO $ do
            takeMVar m `catch` \e -> do stat 2 MaskedUninterruptible
                                        print (e::SomeException)
                                        throwIO e
    killThread t2
    t3 <- mask_ $ forkIOWithUnmask $ \unmask ->
              unmask $ do stat 3 Unmasked; putMVar m ()
    takeMVar m
    t4 <- uninterruptibleMask_ $ forkIOWithUnmask $ \unmask ->
              unmask $ do stat 4 Unmasked; putMVar m ()
    takeMVar m
  
  stat :: Int -> MaskingState -> IO ()
  stat n m = do 
   s <- getMaskingState
   if (s /= m) 
      then error (printf "%2d: %s\n" n (show s))
      else return ()
  
  