packages feed

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