Skip to content

Commit c9cf125

Browse files
authored
Merge pull request #123 from input-output-hk/coot/forkFinally
Added forkFinally to MonadFork
2 parents 54e8aa1 + 7a18d94 commit c9cf125

File tree

3 files changed

+9
-1
lines changed

3 files changed

+9
-1
lines changed

io-classes/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
### Non-breaking changes
88

9+
* Added `forkFinally` to `MonadFork`.
10+
911
## 1.3.0.0
1012

1113
- `io-sim-1.3.0.0`.

io-classes/src/Control/Monad/Class/MonadFork.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module Control.Monad.Class.MonadFork
1010
) where
1111

1212
import qualified Control.Concurrent as IO
13-
import Control.Exception (AsyncException (ThreadKilled), Exception)
13+
import Control.Exception (AsyncException (ThreadKilled), Exception, SomeException)
1414
import Control.Monad.Reader (ReaderT (..), lift)
1515
import Data.Kind (Type)
1616
import qualified GHC.Conc.Sync as IO (labelThread)
@@ -35,6 +35,7 @@ class MonadThread m => MonadFork m where
3535
forkIO :: m () -> m (ThreadId m)
3636
forkOn :: Int -> m () -> m (ThreadId m)
3737
forkIOWithUnmask :: ((forall a. m a -> m a) -> m ()) -> m (ThreadId m)
38+
forkFinally :: m a -> (Either SomeException a -> m ()) -> m (ThreadId m)
3839
throwTo :: Exception e => ThreadId m -> e -> m ()
3940

4041
killThread :: ThreadId m -> m ()
@@ -52,6 +53,7 @@ instance MonadFork IO where
5253
forkIO = IO.forkIO
5354
forkOn = IO.forkOn
5455
forkIOWithUnmask = IO.forkIOWithUnmask
56+
forkFinally = IO.forkFinally
5557
throwTo = IO.throwTo
5658
killThread = IO.killThread
5759
yield = IO.yield
@@ -68,5 +70,7 @@ instance MonadFork m => MonadFork (ReaderT e m) where
6870
let restore' :: ReaderT e m a -> ReaderT e m a
6971
restore' (ReaderT f) = ReaderT $ restore . f
7072
in runReaderT (k restore') e
73+
forkFinally f k = ReaderT $ \e -> forkFinally (runReaderT f e)
74+
$ \err -> runReaderT (k err) e
7175
throwTo e t = lift (throwTo e t)
7276
yield = lift yield

io-sim/src/Control/Monad/IOSim/Types.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,8 @@ instance MonadFork (IOSim s) where
458458
forkIO task = IOSim $ oneShot $ \k -> Fork task k
459459
forkOn _ task = IOSim $ oneShot $ \k -> Fork task k
460460
forkIOWithUnmask f = forkIO (f unblock)
461+
forkFinally task k = mask $ \restore ->
462+
forkIO $ try (restore task) >>= k
461463
throwTo tid e = IOSim $ oneShot $ \k -> ThrowTo (toException e) tid (k ())
462464
yield = IOSim $ oneShot $ \k -> YieldSim (k ())
463465

0 commit comments

Comments
 (0)