Skip to content

Commit

Permalink
Fix tests broken by retry on reading SBQueue (#8)
Browse files Browse the repository at this point in the history
  • Loading branch information
Raveline authored Mar 25, 2024
1 parent 4023a7b commit 8f70744
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
21 changes: 16 additions & 5 deletions src/Control/Monad/Trace.hs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ module Control.Monad.Trace (
newSBQueueIO,
isEmptySBQueue,
readSBQueue,
readSBQueueOnce,
writeSBQueue
) where

Expand Down Expand Up @@ -104,14 +105,24 @@ isEmptySBQueue (SBQueue queue count _capacity) = do
assert (if isEmpty then numElems == 0 else numElems > 0) $
return isEmpty

-- | Read all the values stored in an 'SBQueue'.
readSBQueue :: SBQueue a -> STM [a]
readSBQueue (SBQueue queue count _capacity) = do
data ShouldRetry = Retry | OnlyOnce
deriving (Eq)

readSBQueue' :: ShouldRetry -> SBQueue a -> STM [a]
readSBQueue' shouldRetry (SBQueue queue count _capacity) = do
elems <- readTVar queue
when (null elems) retry
when (null elems && shouldRetry == Retry) retry
writeTVar queue []
writeTVar count 0
return $ reverse elems
pure $ reverse elems

-- | Read all the values stored in an 'SBQueue'. Retry if none are available.
readSBQueue :: SBQueue a -> STM [a]
readSBQueue = readSBQueue' Retry

-- | A non-retrying version of readSBQueue
readSBQueueOnce :: SBQueue a -> STM [a]
readSBQueueOnce = readSBQueue' OnlyOnce

-- | Write a value to an 'SBQueue'.
writeSBQueue :: SBQueue a -> a -> STM ()
Expand Down
4 changes: 2 additions & 2 deletions src/Monitor/Tracing/Local.hs
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ collectSpanSamples actn = do
samplesTC = spanSamples tracer
pendingTV = pendingSpanCount tracer
liftIO $ fix $ \loop -> do
(mbSample, pending) <- atomically $ (,) <$> readSBQueue samplesTC <*> readTVar pendingTV
(mbSample, pending) <- atomically $ (,) <$> readSBQueueOnce samplesTC <*> readTVar pendingTV
case mbSample of
(x:xs) -> mapM_ addSample (x:xs) >> loop
[] | pending > 0 -> do
toAdd <- liftIO (atomically $ readSBQueue samplesTC)
toAdd <- liftIO (atomically $ readSBQueueOnce samplesTC)
mapM_ addSample toAdd
loop
_ -> pure ()
Expand Down

0 comments on commit 8f70744

Please sign in to comment.