From 4874b82a019b44166385d692eeddbf417b626140 Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Sat, 12 Feb 2022 00:55:59 +0100 Subject: [PATCH] Add isDisposing --- src/Quasar/Resources/Disposer.hs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Quasar/Resources/Disposer.hs b/src/Quasar/Resources/Disposer.hs index 009b227..75270d2 100644 --- a/src/Quasar/Resources/Disposer.hs +++ b/src/Quasar/Resources/Disposer.hs @@ -6,6 +6,7 @@ module Quasar.Resources.Disposer ( dispose, disposeEventuallySTM, disposeEventuallySTM_, + isDisposing, isDisposed, newPrimitiveDisposer, @@ -20,6 +21,7 @@ import Control.Concurrent (forkIO) import Control.Concurrent.STM import Control.Monad (foldM) import Control.Monad.Catch +import Data.Either (isRight) import Data.HashMap.Strict (HashMap) import Data.HashMap.Strict qualified as HM import Data.HashSet (HashSet) @@ -75,6 +77,13 @@ isDisposed resource = FnDisposer _ _ _ state _ -> join (toAwaitable state) ResourceManagerDisposer resourceManager -> resourceManagerIsDisposed resourceManager +isDisposing :: Resource a => a -> Awaitable () +isDisposing resource = + case getDisposer resource of + FnDisposer _ _ _ state _ -> unsafeAwaitSTM (check . isRight =<< readTOnceState state) + ResourceManagerDisposer resourceManager -> resourceManagerIsDisposing resourceManager + + beginDisposeFnDisposer :: TIOWorker -> ExceptionChannel -> DisposerState -> Finalizers -> STM (Awaitable ()) beginDisposeFnDisposer worker exChan disposeState finalizers = @@ -235,6 +244,13 @@ resourceManagerIsDisposed rm = unsafeAwaitSTM $ ResourceManagerDisposed -> pure () _ -> retry +resourceManagerIsDisposing :: ResourceManager -> Awaitable () +resourceManagerIsDisposing rm = unsafeAwaitSTM $ + readTVar (resourceManagerState rm) >>= \case + (ResourceManagerNormal _ _) -> retry + _ -> pure () + + -- * Implementation internals -- GitLab