on master help sign in
use Prim Var instead of IORef
commit135063fb0cda9ab391f2dd48e37f6424fc5181c0 authorHarendra Kumar <harendra.kumar@gmail.com> dateFri 27 Dec 2019, 22:44 (7 years ago) parent9710c7b
1 file changed+14−13
src/Streamly/Internal/Data/Stream/StreamD.hs+14−13
src/Streamly/Internal/Data/Stream/StreamD.hs+14−13
@@ -315,7 +315,7 @@ import Control.Monad.State.Strict (StateT)
315315import Control.Monad.Trans (MonadTrans(lift))
316316import Data.Bits (shiftR, shiftL, (.|.), (.&.))
317317import Data.Functor.Identity (Identity(..))
318−import Data.IORef (newIORef, readIORef, mkWeakIORef, writeIORef, modifyIORef')
318+import Data.IORef (newIORef, readIORef, mkWeakIORef, writeIORef)
319319import Data.Maybe (fromJust, isJust, isNothing)
320320import Data.Word (Word32)
321321import Foreign.Ptr (Ptr)
@@ -334,7 +334,8 @@ import qualified Control.Monad.Reader as Reader
334334import qualified Control.Monad.State.Strict as State
335335import qualified Prelude
336336
337−import Streamly.Internal.Mutable.Prim.Var (MonadMut, Prim, Var, readVar)
337+import Streamly.Internal.Mutable.Prim.Var
338+ (MonadMut, Prim, Var, readVar, newVar, modifyVar')
338339import Streamly.Internal.Data.Atomics (atomicModifyIORefCAS_)
339340import Streamly.Internal.Memory.Array.Types (Array(..))
340341import Streamly.Internal.Data.Fold.Types (Fold(..))
@@ -3251,36 +3252,36 @@ tapRate ::
32513252tapRate samplingRate action (Stream step state) = Stream step' Nothing
32523253 where
32533254 {-# NOINLINE loop #-}
3254− loop countRef prev = do
3255+ loop countVar prev = do
32553256 i <-
32563257 MC.catch
32573258 (do liftIO $ threadDelay (round $ samplingRate * 1000000)
3258− i <- liftIO $ readIORef countRef
3259+ i <- liftIO $ readVar countVar
32593260 let !diff = i - prev
32603261 void $ action diff
32613262 return i)
32623263 (\(e :: AsyncException) -> do
3263− i <- liftIO $ readIORef countRef
3264+ i <- liftIO $ readVar countVar
32643265 let !diff = i - prev
32653266 void $ action diff
32663267 throwM (MC.toException e))
3267− loop countRef i
3268+ loop countVar i
32683269
32693270 {-# INLINE_LATE step' #-}
32703271 step' _ Nothing = do
3271− countRef <- liftIO $ newIORef 0
3272− tid <- fork $ loop countRef 0
3272+ countVar <- liftIO $ newVar 0
3273+ tid <- fork $ loop countVar 0
32733274 ref <- liftIO $ newIORef ()
32743275 _ <- liftIO $ mkWeakIORef ref (killThread tid)
3275− return $ Skip (Just (countRef, tid, state, ref))
3276+ return $ Skip (Just (countVar, tid, state, ref))
32763277
3277− step' gst (Just (countRef, tid, st, ref)) = do
3278+ step' gst (Just (countVar, tid, st, ref)) = do
32783279 r <- step gst st
32793280 case r of
32803281 Yield x s -> do
3281− liftIO $ modifyIORef' countRef (+ 1)
3282− return $ Yield x (Just (countRef, tid, s, ref))
3283− Skip s -> return $ Skip (Just (countRef, tid, s, ref))
3282+ liftIO $ modifyVar' countVar (+ 1)
3283+ return $ Yield x (Just (countVar, tid, s, ref))
3284+ Skip s -> return $ Skip (Just (countVar, tid, s, ref))
32843285 Stop -> do
32853286 liftIO $ killThread tid
32863287 return Stop