Skip to content

Commit 40f3996

Browse files
committed
C.M.Class.MonadSTM.Internal.tryReadTBQueueDefault: lazy reverse
1 parent c3515e1 commit 40f3996

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

io-classes/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Revsion history of io-classes
22

3+
### next version
4+
5+
* Improved performance of `tryReadTBQueueDefault`.
6+
37
### 1.8.0.1
48

59
* Added support for `ghc-9.2`.

io-classes/src/Control/Monad/Class/MonadSTM/Internal.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -919,12 +919,15 @@ tryReadTBQueueDefault (TBQueue rsize read _wsize write _size) = do
919919
return (Just x)
920920
[] -> do
921921
ys <- readTVar write
922-
case reverse ys of
922+
case ys of
923923
[] -> return Nothing
924+
_ -> do
925+
-- NB. lazy: we want the transaction to be
926+
-- short, otherwise it will conflict
927+
let ~(z,zs) = case reverse ys of
928+
z':zs' -> (z',zs')
929+
_ -> error "tryReadTBQueueDefault: impossible"
924930

925-
-- NB. lazy: we want the transaction to be
926-
-- short, otherwise it will conflict
927-
(z:zs) -> do
928931
writeTVar write []
929932
writeTVar read zs
930933
return (Just z)

0 commit comments

Comments
 (0)