on master help sign in
Add support to switch to C malloc vs GHC malloc
b38198cHarendra Kumar
src/Streamly/Memory/Array/Types.hs+6−5
@@ -98,8 +98,7 @@ import Text.Read (readPrec, readListPrec, readListPrecDefault)
98
98
99import GHC.Base (Addr#, realWorld#)
99import GHC.Base (Addr#, realWorld#)
100import GHC.Exts (IsList, IsString(..))
100import GHC.Exts (IsList, IsString(..))
101−import GHC.ForeignPtr
101+import GHC.ForeignPtr (ForeignPtr(..), newForeignPtr_)
102− (ForeignPtr(..), mallocPlainForeignPtrAlignedBytes, newForeignPtr_)
103import GHC.IO (IO(IO), unsafePerformIO)
102import GHC.IO (IO(IO), unsafePerformIO)
104import GHC.Ptr (Ptr(..))
103import GHC.Ptr (Ptr(..))
105
104
@@ -112,6 +111,7 @@ import Streamly.SVar (adaptState)
112import Streamly.FileSystem.FDIO (IOVec(..))
111import Streamly.FileSystem.FDIO (IOVec(..))
113#endif
112#endif
114
113
114+import qualified Streamly.Memory.Malloc as Malloc
115import qualified Streamly.Streams.StreamD.Type as D
115import qualified Streamly.Streams.StreamD.Type as D
116import qualified Streamly.Streams.StreamK as K
116import qualified Streamly.Streams.StreamK as K
117import qualified GHC.Exts as Exts
117import qualified GHC.Exts as Exts
@@ -237,7 +237,7 @@ bytesToElemCount x n =
237newArray :: forall a. Storable a => Int -> IO (Array a)
237newArray :: forall a. Storable a => Int -> IO (Array a)
238newArray count = do
238newArray count = do
239 let size = count * sizeOf (undefined :: a)
239 let size = count * sizeOf (undefined :: a)
240− fptr <- mallocPlainForeignPtrAlignedBytes size (alignment (undefined :: a))
240+ fptr <- Malloc.mallocForeignPtrAlignedBytes size (alignment (undefined :: a))
241 let p = unsafeForeignPtrToPtr fptr
241 let p = unsafeForeignPtrToPtr fptr
242 return $ Array
242 return $ Array
243 { aStart = fptr
243 { aStart = fptr
@@ -275,7 +275,8 @@ snoc arr@Array {..} x = do
275 let oldStart = unsafeForeignPtrToPtr aStart
275 let oldStart = unsafeForeignPtrToPtr aStart
276 size = aEnd `minusPtr` oldStart
276 size = aEnd `minusPtr` oldStart
277 newSize = (size + (sizeOf (undefined :: a)))
277 newSize = (size + (sizeOf (undefined :: a)))
278+ newPtr <- Malloc.mallocForeignPtrAlignedBytes
278− newPtr <- mallocPlainForeignPtrAlignedBytes newSize (alignment (undefined :: a))
279+ newSize (alignment (undefined :: a))
279 withForeignPtr newPtr $ \pNew -> do
280 withForeignPtr newPtr $ \pNew -> do
280 memcpy (castPtr pNew) (castPtr oldStart) size
281 memcpy (castPtr pNew) (castPtr oldStart) size
281 poke (pNew `plusPtr` size) x
282 poke (pNew `plusPtr` size) x
@@ -298,7 +299,7 @@ realloc newSize Array{..} = do
298 assert (aEnd <= aBound) (return ())
299 assert (aEnd <= aBound) (return ())
299 let oldStart = unsafeForeignPtrToPtr aStart
300 let oldStart = unsafeForeignPtrToPtr aStart
300 let size = aEnd `minusPtr` oldStart
301 let size = aEnd `minusPtr` oldStart
301− newPtr <- mallocPlainForeignPtrAlignedBytes
302+ newPtr <- Malloc.mallocForeignPtrAlignedBytes
302 newSize (alignment (undefined :: a))
303 newSize (alignment (undefined :: a))
303 withForeignPtr newPtr $ \pNew -> do
304 withForeignPtr newPtr $ \pNew -> do
304 memcpy (castPtr pNew) (castPtr oldStart) size
305 memcpy (castPtr pNew) (castPtr oldStart) size
src/Streamly/Memory/Malloc.hsnew file+46
@@ -0,0 +1,46 @@
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE BangPatterns #-}
3+{-# LANGUAGE ExistentialQuantification #-}
4+{-# LANGUAGE MagicHash #-}
5+{-# LANGUAGE RecordWildCards #-}
6+{-# LANGUAGE ScopedTypeVariables #-}
7+{-# LANGUAGE TypeFamilies #-}
8+{-# LANGUAGE UnboxedTuples #-}
9+{-# LANGUAGE FlexibleContexts #-}
10+
11+#include "inline.hs"
12+
13+-- |
14+-- Module : Streamly.Memory.Array.Types
15+-- Copyright : (c) 2019 Composewell Technologies
16+--
17+-- License : BSD3
18+-- Maintainer : harendra.kumar@gmail.com
19+-- Stability : experimental
20+-- Portability : GHC
21+--
22+module Streamly.Memory.Malloc
23+ (
24+ mallocForeignPtrAlignedBytes
25+ )
26+where
27+
28+#define USE_GHC_MALLOC
29+
30+#ifndef USE_GHC_MALLOC
31+import Foreign.ForeignPtr (newForeignPtr)
32+import Foreign.Marshal.Alloc (mallocBytes, finalizerFree)
33+#endif
34+
35+import qualified GHC.ForeignPtr as GHC
36+
37+{-# INLINE mallocForeignPtrAlignedBytes #-}
38+mallocForeignPtrAlignedBytes :: Int -> Int -> IO (GHC.ForeignPtr a)
39+#ifdef USE_GHC_MALLOC
40+mallocForeignPtrAlignedBytes size alignment = do
41+ GHC.mallocPlainForeignPtrAlignedBytes size alignment
42+#else
43+mallocForeignPtrAlignedBytes size _alignment = do
44+ p <- mallocBytes size
45+ newForeignPtr finalizerFree p
46+#endif
streamly.cabal+1
@@ -258,6 +258,7 @@ library
258 , Streamly.Enumeration
258 , Streamly.Enumeration
259
259
260 -- Memory storage
260 -- Memory storage
261+ , Streamly.Memory.Malloc
261 , Streamly.Memory.Array.Types
262 , Streamly.Memory.Array.Types
262 , Streamly.Memory.Ring
263 , Streamly.Memory.Ring
263
264