src/Tools/Haskell/Haskell.thy
changeset 69495 c34dfa431b89
parent 69494 7e44f8e2cc49
child 69496 5256e7f26640
equal deleted inserted replaced
69494:7e44f8e2cc49 69495:c34dfa431b89
  1746     (\infos ->
  1746     (\infos ->
  1747       case lookup_info infos id of
  1747       case lookup_info infos id of
  1748         Nothing -> (infos, ())
  1748         Nothing -> (infos, ())
  1749         Just info -> (Map.insert id (f info) infos, ()))
  1749         Just info -> (Map.insert id (f info) infos, ()))
  1750 
  1750 
       
  1751 delete_info :: ThreadId -> IO ()
       
  1752 delete_info id =
       
  1753   atomicModifyIORef' global_state (\infos -> (Map.delete id infos, ()))
       
  1754 
  1751 
  1755 
  1752 {- thread properties -}
  1756 {- thread properties -}
  1753 
  1757 
  1754 my_info :: IO Info
  1758 my_info :: IO Info
  1755 my_info = do
  1759 my_info = do
  1787       Thread.forkIO
  1791       Thread.forkIO
  1788         (Exception.try
  1792         (Exception.try
  1789           (do
  1793           (do
  1790             id <- Concurrent.myThreadId
  1794             id <- Concurrent.myThreadId
  1791             atomicModifyIORef' global_state (init_info id uuid)
  1795             atomicModifyIORef' global_state (init_info id uuid)
  1792             restore body) >>= finally))
  1796             restore body)
       
  1797          >>= (\res -> do id <- Concurrent.myThreadId; delete_info id; finally res)))
  1793   return (id, uuid, result)
  1798   return (id, uuid, result)
  1794 
  1799 
  1795 fork :: IO a -> IO (Fork a)
  1800 fork :: IO a -> IO (Fork a)
  1796 fork body = fork_finally body Thread.result
  1801 fork body = fork_finally body Thread.result
  1797 \<close>
  1802 \<close>