Skip to content

Commit 2a4ad04

Browse files
committed
trace-forward: make the STM queue not a TVar
1 parent b1d76bf commit 2a4ad04

File tree

2 files changed

+7
-12
lines changed

2 files changed

+7
-12
lines changed

trace-forward/src/Trace/Forward/Utils/ForwardSink.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@ module Trace.Forward.Utils.ForwardSink
66
) where
77

88
import Control.Concurrent.STM.TBQueue
9-
import Control.Concurrent.STM.TVar
109

1110
data ForwardSink lo = ForwardSink
12-
{ forwardQueue :: !(TVar (TBQueue lo))
11+
{ forwardQueue :: !(TBQueue lo)
1312
, disconnectedSize :: !Word
1413
, connectedSize :: !Word
1514
, overflowCallback :: !([lo] -> IO ())

trace-forward/src/Trace/Forward/Utils/TraceObject.hs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import Control.Concurrent.STM.TBQueue
2323
, writeTBQueue
2424
, flushTBQueue
2525
)
26-
import Control.Concurrent.STM.TVar
2726
import Control.Monad (replicateM)
2827
import qualified Data.List.NonEmpty as NE
2928
import Data.Word (Word16)
@@ -42,10 +41,9 @@ initForwardSink
4241
initForwardSink ForwarderConfiguration{disconnectedQueueSize, connectedQueueSize} callback = do
4342
-- Initially we always create a big queue, because during node's start
4443
-- the number of tracing items may be very big.
45-
queueTVar <- atomically $
46-
newTVar =<< newTBQueue (fromIntegral disconnectedQueueSize)
44+
queue <- atomically $ newTBQueue (fromIntegral disconnectedQueueSize)
4745
return $ ForwardSink
48-
{ forwardQueue = queueTVar
46+
{ forwardQueue = queue
4947
, disconnectedSize = disconnectedQueueSize
5048
, connectedSize = connectedQueueSize
5149
, overflowCallback = callback
@@ -62,10 +60,9 @@ writeToSink ForwardSink{forwardQueue,overflowCallback} traceObject = do
6260
-- Don't call the overflow function with an empty list.
6361
_ -> overflowCallback flushedTraceObjects
6462

65-
writeToSinkSTM :: TVar (TBQueue lo) -> lo -> STM [lo]
66-
writeToSinkSTM queueTVar traceObject = do
63+
writeToSinkSTM :: TBQueue lo -> lo -> STM [lo]
64+
writeToSinkSTM queue traceObject = do
6765
---------- STM transaction: start ----------
68-
queue <- readTVar queueTVar
6966
isFull <- isFullTBQueue queue
7067
!flushedTraceObjects <- if isFull
7168
then flushTBQueue queue
@@ -93,15 +90,14 @@ readFromSink ForwardSink{forwardQueue} =
9390
, Forwarder.recvMsgDone = return ()
9491
}
9592

96-
readFromSinkSTM :: TVar (TBQueue lo)
93+
readFromSinkSTM :: TBQueue lo
9794
-- If queue is empty, block or not?
9895
-> TokBlockingStyle blocking
9996
-- Maximum number of requested trace objects.
10097
-> Word16
10198
-> STM [lo]
102-
readFromSinkSTM queueTVar blocking n = do
99+
readFromSinkSTM queue blocking n = do
103100
---------- STM transaction: start ----------
104-
queue <- readTVar queueTVar
105101
-- Instead of using `isEmptyTBQueue`, that internally may read only one TVar,
106102
-- we optimize for the critical path, the case in which the queue has objects
107103
-- and directly use `lengthTBQueue` that always reads two TVars.

0 commit comments

Comments
 (0)