@@ -1,4 +1,3 @@
1−{-# LANGUAGE ForeignFunctionInterface #-}
3-- Module : Data.Attoparsec.ByteString.Buffer
2-- Module : Data.Attoparsec.ByteString.Buffer
4-- Copyright : Bryan O'Sullivan 2007-2014
3-- Copyright : Bryan O'Sullivan 2007-2014
@@ -32,17 +31,15 @@ module Data.Attoparsec.ByteString.Buffer
32 , unsafeDrop
31 , unsafeDrop
35−import Control.Applicative ((<$>))
36import Control.Exception (assert)
34import Control.Exception (assert)
37import Data.ByteString.Internal (ByteString(..), memcpy, nullForeignPtr)
35import Data.ByteString.Internal (ByteString(..), memcpy, nullForeignPtr)
38import Data.Attoparsec.Internal.Fhthagn (inlinePerformIO)
36import Data.Attoparsec.Internal.Fhthagn (inlinePerformIO)
39import Data.List (foldl1')
37import Data.List (foldl1')
40import Data.Monoid (Monoid(..))
38import Data.Monoid (Monoid(..))
41import Data.Word (Word8)
39import Data.Word (Word8)
42−import Foreign.C.Types (CLong(..))
43import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)
40import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)
44−import Foreign.Ptr (Ptr, castPtr, plusPtr)
41+import Foreign.Ptr (castPtr, plusPtr)
45−import Foreign.Storable (peekByteOff, poke, sizeOf)
42+import Foreign.Storable (peek, peekByteOff, poke, sizeOf)
46import GHC.ForeignPtr (mallocPlainForeignPtrBytes)
43import GHC.ForeignPtr (mallocPlainForeignPtrBytes)
47import Prelude hiding (length)
44import Prelude hiding (length)
@@ -78,13 +75,15 @@ instance Monoid Buffer where
78 newlen = len0 + len1
75 newlen = len0 + len1
79 gen <- if gen0 == 0
76 gen <- if gen0 == 0
80 then return 0
77 then return 0
81− else fromIntegral <$> atomic_inc (castPtr ptr0)
78+ else peek (castPtr ptr0)
82− if newlen <= cap0 && gen == gen0 + 1
79+ if gen == gen0 && newlen <= cap0
82+ poke (castPtr ptr0) newgen
84 memcpy (ptr0 `plusPtr` (off0+len0))
83 memcpy (ptr0 `plusPtr` (off0+len0))
85 (ptr1 `plusPtr` off1)
84 (ptr1 `plusPtr` off1)
86 (fromIntegral len1)
85 (fromIntegral len1)
87− return (Buf fp0 off0 newlen cap0 gen)
86+ return (Buf fp0 off0 newlen cap0 newgen)
89 let newcap = newlen * 2
88 let newcap = newlen * 2
90 fp <- mallocPlainForeignPtrBytes (newcap + genSize)
89 fp <- mallocPlainForeignPtrBytes (newcap + genSize)
@@ -121,6 +120,3 @@ unsafeDrop s (Buf fp off len _ _) =
121 assert (s >= 0 && s <= len) $
120 assert (s >= 0 && s <= len) $
122 PS fp (off+s) (len-s)
121 PS fp (off+s) (len-s)
123{-# INLINE unsafeDrop #-}
122{-# INLINE unsafeDrop #-}
125−foreign import ccall unsafe "_atto_atomic_inc" atomic_inc
126− :: Ptr CLong -> IO CLong