module System.IO.Posix.MMap.Internal (
unsafePackMMapPtr,
c_mmap,
c_munmap
) where
import System.IO
import qualified System.IO as IO
import Foreign.C.Types
import Foreign.Ptr
import qualified Foreign.Concurrent as FC
import Control.Monad
import Data.Word
import Data.ByteString.Internal
import Data.ByteString
unsafePackMMapPtr :: Ptr Word8 -> CSize -> IO ByteString
unsafePackMMapPtr p s = do
fp <- FC.newForeignPtr p $ do
v <- c_munmap p s
when (v == 1) $ IO.hPutStrLn stderr $
"System.IO.Posix.MMap: warning, failed to unmap "
++ show s ++" bytes at "++show p
return (fromForeignPtr fp 0 (fromIntegral s))
foreign import ccall unsafe "hs_bytestring_mmap.h hs_bytestring_mmap"
c_mmap :: CSize -> CInt -> IO (Ptr Word8)
foreign import ccall unsafe "hs_bytestring_mmap.h munmap"
c_munmap :: Ptr Word8 -> CSize -> IO CInt