module Data.Mutex
    ( Mutex
    , new
    , lock
    , unlock
    ) where

import Data.Int (Int64)
import Foreign.ForeignPtr (ForeignPtr, mallocForeignPtr, withForeignPtr)
import Foreign.Ptr (Ptr)
import Foreign.Storable (poke)

newtype Mutex = M { unM :: ForeignPtr Int64 }

new :: IO Mutex
new = do
    fp <- mallocForeignPtr
    withForeignPtr fp $ \ p -> poke p 0
    return $ M fp

lock :: Mutex -> IO ()
lock m = withForeignPtr (unM m) cLock

foreign import ccall unsafe "hs_lock" cLock :: Ptr Int64 -> IO ()

unlock :: Mutex -> IO ()
unlock m = withForeignPtr (unM m) cUnlock

foreign import ccall unsafe "hs_unlock" cUnlock :: Ptr Int64 -> IO ()