on master help sign in
move touch at the end of the loop
commitb96d73517e52a42a8fc34e705a29582c3e61bab7 authorHarendra Kumar <harendra.kumar@gmail.com> dateSat 21 Sep 2019, 01:06 (7 years ago) parentb438759
1 file changed+4−5
src/Streamly/Memory/Array/Types.hs+4−5
src/Streamly/Memory/Array/Types.hs+4−5
@@ -420,7 +420,9 @@ readU = Unfold step inject
420420 return $ ReadUState (ForeignPtr end contents) (Ptr start)
421421
422422 {-# INLINE_LATE step #-}
423− step (ReadUState (ForeignPtr end _) p) | p == (Ptr end) = return D.Stop
423+ step (ReadUState fp@(ForeignPtr end _) p) | p == (Ptr end) =
424+ let x = unsafeInlineIO $ touchForeignPtr fp
425+ in x `seq` return D.Stop
424426 step (ReadUState fp p) = do
425427 -- unsafeInlineIO allows us to run this in Identity monad for pure
426428 -- toList/foldr case which makes them much faster due to not
@@ -428,10 +430,7 @@ readU = Unfold step inject
428430 --
429431 -- This should be safe as the array contents are guaranteed to be
430432 -- evaluated/written to before we peek at them.
431− let !x = unsafeInlineIO $ do
432− r <- peek p
433− touchForeignPtr fp
434− return r
433+ let !x = unsafeInlineIO $ peek p
435434 return $ D.Yield x
436435 (ReadUState fp (p `plusPtr` (sizeOf (undefined :: a))))
437436