{-# 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) = forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s ->
case mkWeak# :: 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, forall v. Weak# v -> Weak v
Weak Weak# ThreadId
w #)
addThreadFinalizer :: ThreadId -> IO () -> IO ()
addThreadFinalizer :: ThreadId -> IO () -> IO ()
addThreadFinalizer ThreadId
tid IO ()
m = forall (f :: * -> *) a. Functor f => f a -> f ()
void 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 = forall v. Weak v -> IO ()
finalize