Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Q
quasar
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jens Nolte
quasar
Commits
a9b39780
Commit
a9b39780
authored
3 years ago
by
Jens Nolte
Browse files
Options
Downloads
Patches
Plain Diff
Implement trivialDisposer
parent
9cfef01a
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/Quasar/Resources.hs
+1
-0
1 addition, 0 deletions
src/Quasar/Resources.hs
src/Quasar/Resources/Disposer.hs
+21
-1
21 additions, 1 deletion
src/Quasar/Resources/Disposer.hs
with
22 additions
and
1 deletion
src/Quasar/Resources.hs
+
1
−
0
View file @
a9b39780
...
...
@@ -26,6 +26,7 @@ module Quasar.Resources (
Disposer
,
newUnmanagedIODisposerSTM
,
newUnmanagedSTMDisposerSTM
,
trivialDisposer
,
-- ** Resource manager
ResourceManager
,
...
...
This diff is collapsed.
Click to expand it.
src/Quasar/Resources/Disposer.hs
+
21
−
1
View file @
a9b39780
...
...
@@ -9,6 +9,7 @@ module Quasar.Resources.Disposer (
isDisposing
,
isDisposed
,
newUnmanagedPrimitiveDisposer
,
trivialDisposer
,
-- * Resource manager
ResourceManager
,
...
...
@@ -30,6 +31,7 @@ import Quasar.Exceptions
import
Quasar.Prelude
import
Quasar.Utils.ShortIO
import
Quasar.Utils.TOnce
import
GHC.IO
(
unsafePerformIO
,
unsafeDupablePerformIO
)
class
Resource
a
where
...
...
@@ -39,7 +41,8 @@ class Resource a where
type
DisposerState
=
TOnce
DisposeFn
(
Future
()
)
data
Disposer
=
FnDisposer
Unique
TIOWorker
ExceptionSink
DisposerState
Finalizers
=
TrivialDisposer
|
FnDisposer
Unique
TIOWorker
ExceptionSink
DisposerState
Finalizers
|
ResourceManagerDisposer
ResourceManager
instance
Resource
Disposer
where
...
...
@@ -48,6 +51,10 @@ instance Resource Disposer where
type
DisposeFn
=
ShortIO
(
Future
()
)
-- | A trivial disposer that does not perform any action when disposed.
trivialDisposer
::
Disposer
trivialDisposer
=
TrivialDisposer
newUnmanagedPrimitiveDisposer
::
ShortIO
(
Future
()
)
->
TIOWorker
->
ExceptionSink
->
STM
Disposer
newUnmanagedPrimitiveDisposer
fn
worker
exChan
=
do
key
<-
newUniqueSTM
...
...
@@ -60,6 +67,7 @@ dispose resource = liftIO $ await =<< atomically (disposeEventuallySTM resource)
disposeEventuallySTM
::
Resource
r
=>
r
->
STM
(
Future
()
)
disposeEventuallySTM
resource
=
case
getDisposer
resource
of
TrivialDisposer
->
pure
(
pure
()
)
FnDisposer
_
worker
exChan
state
finalizers
->
do
beginDisposeFnDisposer
worker
exChan
state
finalizers
ResourceManagerDisposer
resourceManager
->
...
...
@@ -72,12 +80,14 @@ disposeEventuallySTM_ resource = void $ disposeEventuallySTM resource
isDisposed
::
Resource
a
=>
a
->
Future
()
isDisposed
resource
=
case
getDisposer
resource
of
TrivialDisposer
->
pure
()
FnDisposer
_
_
_
state
_
->
join
(
toFuture
state
)
ResourceManagerDisposer
resourceManager
->
resourceManagerIsDisposed
resourceManager
isDisposing
::
Resource
a
=>
a
->
Future
()
isDisposing
resource
=
case
getDisposer
resource
of
TrivialDisposer
->
pure
()
FnDisposer
_
_
_
state
_
->
unsafeAwaitSTM
(
check
.
isRight
=<<
readTOnceState
state
)
ResourceManagerDisposer
resourceManager
->
resourceManagerIsDisposing
resourceManager
...
...
@@ -107,11 +117,17 @@ beginDisposeFnDisposer worker exChan disposeState finalizers =
throwM
$
DisposeException
ex
disposerKey
::
Disposer
->
Unique
disposerKey
TrivialDisposer
=
trivialDisposableKey
disposerKey
(
FnDisposer
key
_
_
_
_
)
=
key
disposerKey
(
ResourceManagerDisposer
resourceManager
)
=
resourceManagerKey
resourceManager
trivialDisposableKey
::
Unique
trivialDisposableKey
=
unsafePerformIO
newUnique
{-# NOINLINE trivialDisposableKey #-}
disposerFinalizers
::
Disposer
->
Finalizers
disposerFinalizers
TrivialDisposer
=
completedFinalizers
disposerFinalizers
(
FnDisposer
_
_
_
_
finalizers
)
=
finalizers
disposerFinalizers
(
ResourceManagerDisposer
rm
)
=
resourceManagerFinalizers
rm
...
...
@@ -215,6 +231,7 @@ beginDisposeResourceManagerInternal rm = do
rmKey
=
resourceManagerKey
rm
resourceManagerBeginDispose
::
Disposer
->
STM
DisposeResult
resourceManagerBeginDispose
TrivialDisposer
=
pure
$
DisposeResultAwait
$
pure
()
resourceManagerBeginDispose
(
FnDisposer
_
worker
exChan
state
finalizers
)
=
DisposeResultAwait
<$>
beginDisposeFnDisposer
worker
exChan
state
finalizers
resourceManagerBeginDispose
(
ResourceManagerDisposer
resourceManager
)
=
...
...
@@ -286,3 +303,6 @@ runFinalizersAfter finalizers awaitable = do
void
$
forkIOShortIO
do
await
awaitable
atomically
$
runFinalizers
finalizers
completedFinalizers
::
Finalizers
completedFinalizers
=
unsafeDupablePerformIO
$
Finalizers
<$>
newEmptyTMVarIO
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment