@@ -53,6 +53,7 @@ import qualified Data.ByteString.Builder as BLD
5353import Data.ByteString.Char8 (ByteString )
5454import qualified Data.ByteString.Char8 as B
5555import qualified Data.ByteString.Lazy.Char8 as LB
56+ import Data.Dynamic (toDyn )
5657import Data.Either (fromRight , partitionEithers )
5758import Data.Functor (($>) )
5859import Data.IORef
@@ -71,6 +72,7 @@ import Data.Time.Clock.System (SystemTime (..), getSystemTime)
7172import Data.Time.Format.ISO8601 (iso8601Show )
7273import Data.Type.Equality
7374import Data.Typeable (cast )
75+ import GHC.Conc.Signal
7476import GHC.IORef (atomicSwapIORef )
7577import GHC.Stats (getRTSStats )
7678import GHC.TypeLits (KnownNat )
@@ -149,9 +151,10 @@ smpServer started cfg@ServerConfig {transports, transportConfig = tCfg} attachHT
149151 : sendPendingEvtsThread s
150152 : receiveFromProxyAgent pa
151153 : expireNtfsThread cfg
154+ : sigIntHandlerThread
152155 : map runServer transports <> expireMessagesThread_ cfg <> serverStatsThread_ cfg <> controlPortThread_ cfg
153156 )
154- `finally` withLock' (savingLock s) " final " (saveServer False >> closeServer)
157+ `finally` stopServer s
155158 where
156159 runServer :: (ServiceName , ATransport , AddHTTP ) -> M ()
157160 runServer (tcpPort, ATransport t, addHTTP) = do
@@ -175,6 +178,22 @@ smpServer started cfg@ServerConfig {transports, transportConfig = tCfg} attachHT
175178 runTransportServerState ss started tcpPort defaultSupportedParams smpCreds (Just supportedSMPHandshakes) tCfg $ \ h -> runClient serverSignKey t h `runReaderT` env
176179 fromTLSCredentials (_, pk) = C. x509ToPrivate (pk, [] ) >>= C. privKey
177180
181+ sigIntHandlerThread :: M ()
182+ sigIntHandlerThread = do
183+ flagINT <- newEmptyTMVarIO
184+ let sigINT = 2 -- CONST_SIGINT value
185+ sigIntAction = \ _ptr -> atomically $ void $ tryPutTMVar flagINT ()
186+ sigIntHandler = Just (sigIntAction, toDyn () )
187+ void $ liftIO $ setHandler sigINT sigIntHandler
188+ atomically $ readTMVar flagINT
189+ logInfo " Received SIGINT, stopping server..."
190+
191+ stopServer :: Server -> M ()
192+ stopServer s = do
193+ logInfo " Saving server state..."
194+ withLock' (savingLock s) " final" $ saveServer False >> closeServer
195+ logInfo " Server stopped"
196+
178197 saveServer :: Bool -> M ()
179198 saveServer keepMsgs = withLog closeStoreLog >> saveServerMessages keepMsgs >> saveServerNtfs >> saveServerStats
180199
0 commit comments