From e6621ee2b3a5b258708424430f2a594c1e0bfbb0 Mon Sep 17 00:00:00 2001 From: "Evgeny @ SimpleX Chat" <259188159+evgeny-simplex@users.noreply.github.com> Date: Mon, 17 Aug 2026 21:51:00 +0000 Subject: [PATCH] simplify --- src/Simplex/Messaging/Agent.hs | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/Simplex/Messaging/Agent.hs b/src/Simplex/Messaging/Agent.hs index c1a2732b5..c64adff8c 100644 --- a/src/Simplex/Messaging/Agent.hs +++ b/src/Simplex/Messaging/Agent.hs @@ -2287,7 +2287,10 @@ runCommandProcessing c@AgentClient {subQ} connId server_ Worker {doWork} = do setSndQueuePrimary db connId sq' void $ setSndSwitchStatus db oldSq $ Just SSSendingQEND let sq'' = (sq' :: SndQueue) {status = Active, primary = True, dbReplaceQueueId = Nothing} - resumeSecuredSndDelivery c sq'' + -- count R''s deliveries held while securing into msgDeliveryOp before starting its worker (it subtracts one per delivery) + pending <- withStore' c $ \db -> countSndQueueDeliveries db sq'' + atomically $ modifyTVar' (msgDeliveryOp c) $ \s -> s {opsInProgress = opsInProgress s + pending} + lift $ resumeMsgDelivery c sq'' void $ enqueueMessages c cData [oldSq, sq''] SMP.noMsgFlags $ QEND [qAddress oldSq] SomeConn _ conn' <- withStore c (`getConn` connId) cStats <- connectionStats c conn' @@ -2457,12 +2460,10 @@ resumeMsgDelivery :: AgentClient -> SndQueue -> AM' () -- hasWork is passed as False to avoid unnecessary write to TMVar: -- - new worker is always created by "some work to do". -- - if the worker already exists, there is no need to "push" it again. -resumeMsgDelivery c sq - | securingSndQueue sq = pure () - | otherwise = void $ getDeliveryWorker False c sq +resumeMsgDelivery c sq = unless (securingSndQueue sq) $ void $ getDeliveryWorker False c sq {-# INLINE resumeMsgDelivery #-} --- a replacement queue holds its worker until it is secured and its confirmation is sent +-- a replacement queue not yet secured (New, still referencing the queue it replaces) securingSndQueue :: SndQueue -> Bool securingSndQueue SndQueue {status, dbReplaceQueueId} = status == New && isJust dbReplaceQueueId {-# INLINE securingSndQueue #-} @@ -2476,19 +2477,9 @@ getDeliveryWorker hasWork c sq = pure (w, retryLock) submitPendingMsg :: AgentClient -> SndQueue -> AM' () -submitPendingMsg c sq - | securingSndQueue sq = pure () - | otherwise = do - atomically $ modifyTVar' (msgDeliveryOp c) $ \s -> s {opsInProgress = opsInProgress s + 1} - void $ getDeliveryWorker True c sq - --- starts the worker of a queue whose delivery was held while it was securing: its accumulated deliveries were not --- counted in msgDeliveryOp, so add them before the worker starts, as it subtracts one per delivery. -resumeSecuredSndDelivery :: AgentClient -> SndQueue -> AM () -resumeSecuredSndDelivery c sq = do - pending <- withStore' c $ \db -> countSndQueueDeliveries db sq - atomically $ modifyTVar' (msgDeliveryOp c) $ \s -> s {opsInProgress = opsInProgress s + pending} - lift $ resumeMsgDelivery c sq +submitPendingMsg c sq = unless (securingSndQueue sq) $ do + atomically $ modifyTVar' (msgDeliveryOp c) $ \s -> s {opsInProgress = opsInProgress s + 1} + void $ getDeliveryWorker True c sq runSmpQueueMsgDelivery :: AgentClient -> SndQueue -> (Worker, TMVar ()) -> AM () runSmpQueueMsgDelivery c@AgentClient {subQ} sq@SndQueue {userId, connId, server, queueMode} (Worker {doWork}, qLock) = do