eventloop-0.5.0.0: src/Eventloop/System/TeardownThread.hs
module Eventloop.System.TeardownThread
( startTeardowning
) where
import Control.Exception
import Control.Concurrent.MVar
import Eventloop.System.ThreadActions
import Eventloop.Types.Exception
import Eventloop.Types.System
startTeardowning :: EventloopSystemConfiguration progstateT
-> IO ()
startTeardowning systemConfig
= mapM_ (teardownModule sharedIOStateM_) moduleConfigs_
where
sharedIOStateM_ = sharedIOStateM systemConfig
moduleConfigs_ = moduleConfigs systemConfig
teardownModule :: MVar SharedIOState
-> EventloopModuleConfiguration
-> IO ()
teardownModule sharedIOStateM_ moduleConfig
= case (teardownM moduleConfig) of
Nothing -> return ()
(Just teardown) ->
teardownIOState sharedIOStateM_ iostateM_
( \exception ->
throwIO (TeardownException moduleId_ exception)
)
teardown
where
moduleId_ = moduleId moduleConfig
iostateM_ = iostateM moduleConfig