From cc798145d2e26be8986747dfe3e5524b45699fab Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Wed, 6 Jul 2022 13:58:58 +0100 Subject: [PATCH] suspend agent without delay (#463) * suspend agent without delay * suspend/activate in separate atomically --- src/Simplex/Messaging/Agent.hs | 17 +++++++++-------- src/Simplex/Messaging/Agent/Client.hs | 4 ++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Simplex/Messaging/Agent.hs b/src/Simplex/Messaging/Agent.hs index 8cc8ec03a..ce0fdcd66 100644 --- a/src/Simplex/Messaging/Agent.hs +++ b/src/Simplex/Messaging/Agent.hs @@ -805,17 +805,18 @@ setNtfServers' :: AgentMonad m => AgentClient -> [NtfServer] -> m () setNtfServers' c = atomically . writeTVar (ntfServers c) activateAgent' :: AgentMonad m => AgentClient -> m () -activateAgent' c = atomically $ do - writeTVar (agentState c) ASActive - activate databaseOp - activate sndNetworkOp - activate msgDeliveryOp - activate rcvNetworkOp - activate ntfNetworkOp +activateAgent' c = do + atomically $ writeTVar (agentState c) ASActive + mapM_ activate $ reverse agentOperations where - activate opSel = modifyTVar' (opSel c) $ \s -> s {opSuspended = False} + activate opSel = atomically $ modifyTVar' (opSel c) $ \s -> s {opSuspended = False} suspendAgent' :: AgentMonad m => AgentClient -> Int -> m () +suspendAgent' c 0 = do + atomically $ writeTVar (agentState c) ASSuspended + mapM_ suspend agentOperations + where + suspend opSel = atomically $ modifyTVar' (opSel c) $ \s -> s {opSuspended = True} suspendAgent' c@AgentClient {agentState = as} maxDelay = do state <- atomically $ do diff --git a/src/Simplex/Messaging/Agent/Client.hs b/src/Simplex/Messaging/Agent/Client.hs index 4fb5f2822..fc3a6d43c 100644 --- a/src/Simplex/Messaging/Agent/Client.hs +++ b/src/Simplex/Messaging/Agent/Client.hs @@ -54,6 +54,7 @@ module Simplex.Messaging.Agent.Client AgentOperation (..), AgentOpState (..), AgentState (..), + agentOperations, agentOperationBracket, beginAgentOperation, endAgentOperation, @@ -155,6 +156,9 @@ agentOpSel = \case AOSndNetwork -> sndNetworkOp AODatabase -> databaseOp +agentOperations :: [AgentClient -> TVar AgentOpState] +agentOperations = [ntfNetworkOp, rcvNetworkOp, msgDeliveryOp, sndNetworkOp, databaseOp] + data AgentOpState = AgentOpState {opSuspended :: Bool, opsInProgress :: Int} data AgentState = ASActive | ASSuspending | ASSuspended