Skip to content
Snippets Groups Projects
Commit c364e76c authored by Jens Nolte's avatar Jens Nolte
Browse files

Fix disposing an empty resource manager after a delay

parent 2eb1a71d
No related branches found
No related tags found
No related merge requests found
...@@ -255,19 +255,20 @@ collectGarbage resourceManager = go >> traceIO "gc: completed" ...@@ -255,19 +255,20 @@ collectGarbage resourceManager = go >> traceIO "gc: completed"
go :: IO () go :: IO ()
go = do go = do
traceIO "gc: go" traceIO "gc: go"
(snapshot, disposing) <- atomically $ do snapshot <- atomically $ readTVar entriesVar'
snapshot <- readTVar entriesVar'
disposing <- readTVar (disposingVar resourceManager)
pure (snapshot, disposing)
let listChanged = simpleAwaitable $ do let listChanged = simpleAwaitable do
newLength <- Seq.length <$> readTVar entriesVar' newLength <- Seq.length <$> readTVar entriesVar'
when (newLength == Seq.length snapshot) retry when (newLength == Seq.length snapshot) retry
isDisposing = simpleAwaitable do
disposing <- readTVar (disposingVar resourceManager)
unless disposing retry
-- Wait for any entry to complete or until a new entry is added -- Wait for any entry to complete or until a new entry is added
let awaitables = (toAwaitable <$> toList snapshot) let awaitables = (toAwaitable <$> toList snapshot)
awaitIO if Quasar.Prelude.null awaitables awaitIO if Quasar.Prelude.null awaitables
then unless disposing $ listChanged then awaitAny2 listChanged isDisposing
else awaitAny (listChanged :| awaitables) else awaitAny (listChanged :| awaitables)
traceIO "gc: change detected" traceIO "gc: change detected"
......
...@@ -30,7 +30,7 @@ spec = parallel $ do ...@@ -30,7 +30,7 @@ spec = parallel $ do
awaitIO avar awaitIO avar
it "can be awaited and completed later" $ do it "can be awaited when completed asynchronously" $ do
avar <- newAsyncVar :: IO (AsyncVar ()) avar <- newAsyncVar :: IO (AsyncVar ())
void $ forkIO $ do void $ forkIO $ do
threadDelay 100000 threadDelay 100000
...@@ -86,7 +86,7 @@ spec = parallel $ do ...@@ -86,7 +86,7 @@ spec = parallel $ do
putAsyncVar_ avar () putAsyncVar_ avar ()
withDefaultAsyncManager (id <$> await avar) withDefaultAsyncManager (id <$> await avar)
xit "can fmap the result of an async that is completed later" $ do it "can fmap the result of an async that is completed later" $ do
avar <- newAsyncVar :: IO (AsyncVar ()) avar <- newAsyncVar :: IO (AsyncVar ())
void $ forkIO $ do void $ forkIO $ do
threadDelay 100000 threadDelay 100000
...@@ -98,7 +98,7 @@ spec = parallel $ do ...@@ -98,7 +98,7 @@ spec = parallel $ do
putAsyncVar_ avar () putAsyncVar_ avar ()
withDefaultAsyncManager (await avar >>= pure) withDefaultAsyncManager (await avar >>= pure)
xit "can bind the result of an async that is completed later" $ do it "can bind the result of an async that is completed later" $ do
avar <- newAsyncVar :: IO (AsyncVar ()) avar <- newAsyncVar :: IO (AsyncVar ())
void $ forkIO $ do void $ forkIO $ do
threadDelay 100000 threadDelay 100000
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment