packages feed

robin-0.1.0.0: src/Lock.hs

module Lock (ensureLock, withLock) where

import Control.Exception.Lifted
import Control.Monad.Trans
import Control.Monad.Trans.Resource
import System.Posix.Semaphore

name :: String
name = "/robin-xRBVe8IB7Z"

ensureLock :: (MonadIO m) => m Semaphore
ensureLock = liftIO $ semOpen name flags 0x700 1
  where
    flags = OpenSemFlags { semCreate = True, semExclusive = False }

withLock :: (MonadBaseControl IO m, MonadIO m) => m a -> m a
withLock m =
  liftIO ensureLock
  >>= \sem -> bracket_ (liftIO $ semWait sem) (liftIO $ semPost sem) m