@@ -1,4 +1,3 @@
1−{-# LANGUAGE ForeignFunctionInterface #-}
21-- |
32-- Module : Data.Attoparsec.ByteString.Buffer
43-- Copyright : Bryan O'Sullivan 2007-2014
@@ -32,17 +31,15 @@ module Data.Attoparsec.ByteString.Buffer
3231 , unsafeDrop
3332 ) where
3433
35−import Control.Applicative ((<$>))
3634import Control.Exception (assert)
3735import Data.ByteString.Internal (ByteString(..), memcpy, nullForeignPtr)
3836import Data.Attoparsec.Internal.Fhthagn (inlinePerformIO)
3937import Data.List (foldl1')
4038import Data.Monoid (Monoid(..))
4139import Data.Word (Word8)
42−import Foreign.C.Types (CLong(..))
4340import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)
44−import Foreign.Ptr (Ptr, castPtr, plusPtr)
45−import Foreign.Storable (peekByteOff, poke, sizeOf)
41+import Foreign.Ptr (castPtr, plusPtr)
42+import Foreign.Storable (peek, peekByteOff, poke, sizeOf)
4643import GHC.ForeignPtr (mallocPlainForeignPtrBytes)
4744import Prelude hiding (length)
4845
@@ -78,13 +75,15 @@ instance Monoid Buffer where
7875 newlen = len0 + len1
7976 gen <- if gen0 == 0
8077 then return 0
81− else fromIntegral <$> atomic_inc (castPtr ptr0)
82− if newlen <= cap0 && gen == gen0 + 1
78+ else peek (castPtr ptr0)
79+ if gen == gen0 && newlen <= cap0
8380 then do
81+ let newgen = gen + 1
82+ poke (castPtr ptr0) newgen
8483 memcpy (ptr0 `plusPtr` (off0+len0))
8584 (ptr1 `plusPtr` off1)
8685 (fromIntegral len1)
87− return (Buf fp0 off0 newlen cap0 gen)
86+ return (Buf fp0 off0 newlen cap0 newgen)
8887 else do
8988 let newcap = newlen * 2
9089 fp <- mallocPlainForeignPtrBytes (newcap + genSize)
@@ -121,6 +120,3 @@ unsafeDrop s (Buf fp off len _ _) =
121120 assert (s >= 0 && s <= len) $
122121 PS fp (off+s) (len-s)
123122{-# INLINE unsafeDrop #-}
124−
125−foreign import ccall unsafe "_atto_atomic_inc" atomic_inc
126− :: Ptr CLong -> IO CLong