on master help sign in
Switched mallocBuffer finalizer
09763eaMartin Bailey
warp/Network/Wai/Handler/Warp/Buffer.hs+4−4
@@ -5,10 +5,10 @@ import qualified Data.Streaming.ByteString.Builder.Buffer as B (Buffer (..))
5import Data.Word (Word8)
5import Data.Word (Word8)
6import Data.IORef (IORef, newIORef, readIORef, writeIORef)
6import Data.IORef (IORef, newIORef, readIORef, writeIORef)
7import Data.ByteString (ByteString, empty, length)
7import Data.ByteString (ByteString, empty, length)
8−import Data.ByteString.Internal (ByteString(PS), mallocByteString, c_free_finalizer)
8+import Data.ByteString.Internal (ByteString(PS), mallocByteString)
9import Data.ByteString.Unsafe (unsafeTake, unsafeDrop)
9import Data.ByteString.Unsafe (unsafeTake, unsafeDrop)
10import Foreign.ForeignPtr (newForeignPtr, newForeignPtr_, withForeignPtr)
10import Foreign.ForeignPtr (newForeignPtr, newForeignPtr_, withForeignPtr)
11−import Foreign.Marshal.Alloc (mallocBytes, free)
11+import Foreign.Marshal.Alloc (mallocBytes, free, finalizerFree)
12import Foreign.Ptr (Ptr, castPtr, plusPtr)
12import Foreign.Ptr (Ptr, castPtr, plusPtr)
13
13
14largeBufferSize :: Int
14largeBufferSize :: Int
@@ -24,7 +24,7 @@ newBufferPool = newIORef Data.ByteString.empty
24mallocBuffer :: Int -> IO ByteString
24mallocBuffer :: Int -> IO ByteString
25mallocBuffer size = do
25mallocBuffer size = do
26 ptr <- mallocBytes size
26 ptr <- mallocBytes size
27− fptr <- newForeignPtr c_free_finalizer ptr
27+ fptr <- newForeignPtr finalizerFree ptr
28 return $! PS fptr 0 size
28 return $! PS fptr 0 size
29{-# INLINE mallocBuffer #-}
29{-# INLINE mallocBuffer #-}
30
30
@@ -41,7 +41,7 @@ usefulBuffer buffer = Data.ByteString.length buffer >= minBufferSize
41getBuffer :: BufferPool -> IO ByteString
41getBuffer :: BufferPool -> IO ByteString
42getBuffer pool = do
42getBuffer pool = do
43 buffer <- readIORef pool
43 buffer <- readIORef pool
44− if usefulBuffer buffer then return buffer else createBuffer largeBufferSize
44+ if usefulBuffer buffer then return buffer else mallocBuffer largeBufferSize
45{-# INLINE getBuffer #-}
45{-# INLINE getBuffer #-}
46
46
47putBuffer :: BufferPool -> ByteString -> IO ()
47putBuffer :: BufferPool -> ByteString -> IO ()