File tree Expand file tree Collapse file tree 2 files changed +22
-5
lines changed
Expand file tree Collapse file tree 2 files changed +22
-5
lines changed Original file line number Diff line number Diff line change @@ -38,6 +38,7 @@ import Data.ByteString.Lazy qualified as BSL
3838import Data.MemPack
3939import Data.MemPack.Buffer
4040import Data.MemPack.Error
41+ import Data.Primitive.ByteArray
4142import Data.Primitive.Ptr
4243import Data.String (IsString )
4344import Data.Text qualified as T
@@ -240,12 +241,19 @@ hPutBuffer handle u =
240241 buffer
241242 u
242243 ( \ bytes -> do
243- withForeignPtr (pinnedByteArrayToForeignPtr bytes) $ \ ptr -> do
244+ pinnedBytes <- pinIfNeeded (ByteArray bytes)
245+ withForeignPtr (byteArrayAsForeignPtr pinnedBytes) $ \ ptr -> do
244246 hPutBuf handle ptr len
245247 )
246- (\ addr -> hPutBuf handle (Ptr addr) len) -- Write Ptr#
248+ (\ addr -> hPutBuf handle (Ptr addr) len)
247249 where
248250 len = bufferByteCount u
251+ pinIfNeeded bytes
252+ | isByteArrayPinned bytes = return bytes
253+ | otherwise = do
254+ dest <- newPinnedByteArray len
255+ copyByteArray dest 0 bytes 0 len
256+ unsafeFreezeByteArray dest
249257
250258runDecode :: (IsString e ) => Fail e a -> Either e a
251259runDecode f = runFailLast f
Original file line number Diff line number Diff line change @@ -39,6 +39,7 @@ import Data.ByteString.Lazy qualified as BSL
3939import Data.MemPack
4040import Data.MemPack.Buffer
4141import Data.MemPack.Error
42+ import Data.Primitive.ByteArray
4243import Data.Primitive.Ptr
4344import Data.Text qualified as T
4445import Data.Typeable
@@ -245,12 +246,20 @@ hPutBuffer handle u =
245246 buffer
246247 u
247248 ( \ bytes off -> do
248- withForeignPtr (pinnedByteArrayToForeignPtr bytes) $ \ ptr -> do
249- hPutBuf handle (ptr `plusPtr` (I # off)) (len - (I # off))
249+ (pinnedBytes, offset) <- pinIfNeeded (ByteArray bytes) (I # off)
250+ withForeignPtr (byteArrayAsForeignPtr pinnedBytes) $ \ ptr -> do
251+ hPutBuf handle (ptr `plusPtr` offset) (len - offset)
250252 )
251- (\ addr -> hPutBuf handle (Ptr addr) len) -- Write Ptr#
253+ (\ addr -> hPutBuf handle (Ptr addr) len)
252254 where
253255 len = bufferByteCount u
256+ pinIfNeeded bytes off
257+ | isByteArrayPinned bytes = return (bytes, off)
258+ | otherwise = do
259+ let l = len - off
260+ dest <- newPinnedByteArray l
261+ copyByteArray dest 0 bytes off l
262+ (,0 ) <$> unsafeFreezeByteArray dest
254263
255264runDecode :: (IsString e ) => (forall s . FailT e (ST s ) a ) -> Either e a
256265runDecode f = runST (runFailLastT f)
You can’t perform that action at this time.
0 commit comments