{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}
module Control.Concurrent.Thread.Finalizers
( mkWeakThreadIdWithFinalizer
, addThreadFinalizer
, finalizeThread
) where
import Control.Concurrent
import Control.Exception
import Control.Monad ( void )
import GHC.IO (IO(..))
import GHC.Prim ( mkWeak# )
import GHC.Weak ( Weak(..), finalize )
import GHC.Conc.Sync ( ThreadId(..) )
mkWeakThreadIdWithFinalizer :: ThreadId -> IO () -> IO (Weak ThreadId)
mkWeakThreadIdWithFinalizer :: ThreadId -> IO () -> IO (Weak ThreadId)
mkWeakThreadIdWithFinalizer t :: ThreadId
t@(ThreadId ThreadId#
t#) (IO State# RealWorld -> (# State# RealWorld, () #)
finalizer) = (State# RealWorld -> (# State# RealWorld, Weak ThreadId #))
-> IO (Weak ThreadId)
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Weak ThreadId #))
-> IO (Weak ThreadId))
-> (State# RealWorld -> (# State# RealWorld, Weak ThreadId #))
-> IO (Weak ThreadId)
forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s ->
case ThreadId#
-> ThreadId
-> (State# RealWorld -> (# State# RealWorld, () #))
-> State# RealWorld
-> (# State# RealWorld, Weak# ThreadId #)
forall a b c.
a
-> b
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# b #)
mkWeak# ThreadId#
t# ThreadId
t State# RealWorld -> (# State# RealWorld, () #)
finalizer State# RealWorld
s of
(# State# RealWorld
s1, Weak# ThreadId
w #) -> (# State# RealWorld
s1, Weak# ThreadId -> Weak ThreadId
forall v. Weak# v -> Weak v
Weak Weak# ThreadId
w #)
addThreadFinalizer :: ThreadId -> IO () -> IO ()
addThreadFinalizer :: ThreadId -> IO () -> IO ()
addThreadFinalizer ThreadId
tid IO ()
m = IO (Weak ThreadId) -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO (Weak ThreadId) -> IO ()) -> IO (Weak ThreadId) -> IO ()
forall a b. (a -> b) -> a -> b
$ ThreadId -> IO () -> IO (Weak ThreadId)
mkWeakThreadIdWithFinalizer ThreadId
tid IO ()
m
finalizeThread :: Weak ThreadId -> IO ()
finalizeThread :: Weak ThreadId -> IO ()
finalizeThread = Weak ThreadId -> IO ()
forall v. Weak v -> IO ()
finalize