packages feed

hnormalise-0.4.1.0: 0mq/Main.hs

module Main where

import System.Posix.Signals (installHandler, Handler(Catch), Handler(CatchOnce), sigINT, sigTERM)
import Control.Concurrent.MVar (modifyMVar_, newMVar, withMVar, tryTakeMVar, putMVar, MVar, newEmptyMVar)

import System.ZMQ4
import Debug.Trace

handler :: MVar () -> Handler
handler s_interrupted = CatchOnce $ trace "modifying" $ putMVar s_interrupted ()

main :: IO ()
main = do
    withContext $ \ctx -> do
        withSocket ctx Pull $ \socket -> do
            bind socket "tcp://*:5555"
            s_interrupted <- newEmptyMVar
            installHandler sigINT (handler s_interrupted) Nothing
            installHandler sigTERM (handler s_interrupted) Nothing
            recvFunction s_interrupted socket
        trace "outside withSocket" $ return ()
    trace "outside withContext" $ return ()


recvFunction :: (Receiver b) => MVar () -> Socket b -> IO ()
recvFunction mi sock = do
    msg <- receive sock
    putStrLn $ "message received: " ++ show msg
    val <- tryTakeMVar mi
    case val of
        Just _  -> putStrLn "W: Interrupt received. Killing Server"
        Nothing -> recvFunction mi sock
{-}    withMVar mi (\val -> if val > 0
        then  putStrLn "W: Interrupt Received. Killing Server"
        else  recvFunction mi sock)
-}
{-

import System.Posix.Signals
import Control.Concurrent (threadDelay)
import Control.Concurrent.MVar

termHandler :: MVar () -> Handler
termHandler v = CatchOnce $ do
    putStrLn "Caught SIGTERM"
    putMVar v ()

loop :: MVar () -> IO ()
loop v = do
    putStrLn "Still running"
    threadDelay 1000000
    val <- tryTakeMVar v
    case val of
        Just _ -> putStrLn "Quitting" >> return ()
        Nothing -> loop v

main = do
    v <- newEmptyMVar
    installHandler sigTERM (termHandler v) Nothing
    loop v⏎

-}