Skip to content

Instantly share code, notes, and snippets.

@tcrayford
Created November 17, 2012 05:05
Show Gist options
  • Save tcrayford/4093440 to your computer and use it in GitHub Desktop.
Save tcrayford/4093440 to your computer and use it in GitHub Desktop.
diff --git a/src/Data/RingBuffer/Vector.hs b/src/Data/RingBuffer/Vector.hs
index ed37817..4c6f05d 100644
--- a/src/Data/RingBuffer/Vector.hs
+++ b/src/Data/RingBuffer/Vector.hs
@@ -51,25 +51,34 @@ newRingBuffer size zero = do
consumeFrom :: MVector a -> Int -> Barrier -> Consumer a -> IO ()
consumeFrom (MVector mvec) modm barr (Consumer fn sq) = do
- vec <- V.unsafeFreeze mvec
- consumeFrom' vec
+ consumeFrom' mvec
where
- consumeFrom' vec = do
+ consumeFrom' mvec = do
next <- addAndGet sq 1
avail <- waitFor barr next
let start = next .&. modm
len = avail - next
- (_,h) = V.splitAt start vec
+ (_,t) = MV.splitAt start mvec
- V.mapM_ fn h
- unless (V.length h >= len) $
- V.mapM_ fn (V.take (len - V.length h) vec)
+ mapMV_ fn t
+ unless (MV.length t >= len) $ do
+ let remaining = (MV.take (len - MV.length t) mvec)
+ mapMV_ fn remaining
writeSeq sq avail
{-# INLINE consumeFrom #-}
+mapMV_ fn mvec = do
+ go 0
+ return ()
+ where go n = if n == max then return () else runFn n
+ max = MV.length mvec
+ runFn n = do
+ MV.unsafeRead mvec n >>= fn
+ go $! n + 1
+
publishTo :: MVector a -> Int -> Sequencer -> Int -> a -> IO ()
publishTo (MVector mvec) modm seqr i v = do
next <- claim seqr i (MV.length mvec)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment