module SharedMemory
( openSharedMemory
) where
import Foreign.C.Types (CSize)
import qualified Foreign.Concurrent as FC
import Foreign.ForeignPtr
import Foreign.Ptr
import System.Posix.Files
import System.Posix.SharedMem
import System.Posix.Types
import MMAP
openSharedMemory :: String -> CSize -> ShmOpenFlags -> FileMode -> IO (ForeignPtr (), Fd)
openSharedMemory shmemPath size openFlags openFileMode = do
fd <- shmOpen shmemPath openFlags openFileMode
setFdSize fd (fromIntegral size)
ptr <- mmap nullPtr
size
(protRead <> protWrite)
(mkMmapFlags mapShared mempty)
fd
0
fptr <- FC.newForeignPtr ptr (munmap ptr size)
return (fptr, fd)