flushTQueue: only perform writeTVar when necessary
authorBas van Dijk <v.dijk.bas@gmail.com>
Tue, 20 Mar 2018 21:31:36 +0000 (22:31 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Sat, 8 Sep 2018 09:08:19 +0000 (11:08 +0200)
To prevent unnecessarily invalidating other transactions writeTVar
must only be called when its contents should actually be changed.

(cherry picked from commit a77aae736a98a605dedc4669d8a4cc55fb2d160e)

Control/Concurrent/STM/TQueue.hs

index b49e310..483db15 100644 (file)
@@ -47,7 +47,7 @@ module Control.Concurrent.STM.TQueue (
   ) where
 
 import GHC.Conc
-
+import Control.Monad (unless)
 import Data.Typeable (Typeable)
 
 -- | 'TQueue' is an abstract type representing an unbounded FIFO channel.
@@ -115,8 +115,8 @@ flushTQueue :: TQueue a -> STM [a]
 flushTQueue (TQueue read write) = do
   xs <- readTVar read
   ys <- readTVar write
-  writeTVar read []
-  writeTVar write []
+  unless (null xs) $ writeTVar read []
+  unless (null ys) $ writeTVar write []
   return (xs ++ reverse ys)
 
 -- | Get the next value from the @TQueue@ without removing it,