Daemon.hs
module Daemon where import System.Exit import System.IO.Unsafe import System.Posix.Signals import Control.Concurrent class DaemonState a where initialise :: IO a work :: a -> IO a finalise :: a -> IO () termReceived = unsafePerformIO (newMVar False) handleTERM :: IO () handleTERM = swapMVar termReceived True >> return () loop :: (DaemonState a) => a -> IO (Maybe a) loop d = do timeToStop <- readMVar termReceived if timeToStop then finalise d >> return Nothing else work d >>= loop start :: (DaemonState a) => IO (Maybe a) start = installHandler sigTERM (Catch handleTERM) Nothing >> initialise >>= loop
Seo úsáid samplach:
Main.hs
module Main where import Daemon instance DaemonState Int where initialise = do putStrLn "Starting up" return 0 work i = do putStrLn (show i) return (i+1) finalise i = do putStrLn "Shutting down" return () main = start :: IO (Maybe Int)
No comments:
Post a Comment