{-# language BangPatterns #-} {-# language MagicHash #-} {-# language UnliftedFFITypes #-} {-# language ScopedTypeVariables #-} module Posix.Poll ( uninterruptiblePoll , uninterruptiblePollMutablePrimArray , PollFd(..) , Exchange(..) , PT.input , PT.output , PT.error , PT.hangup , PT.invalid , PT.isSubeventOf ) where import Posix.Types (CNfds(..)) import Foreign.C.Error (Errno,getErrno) import Foreign.C.Types (CInt(..)) import GHC.Ptr (Ptr) import GHC.Exts (RealWorld,MutableByteArray#) import Posix.Poll.Types (PollFd(..),Exchange(..)) import Data.Primitive (MutablePrimArray(..)) import qualified Posix.Poll.Types as PT foreign import ccall unsafe "poll.h poll" c_poll_ptr :: Ptr PollFd -> CNfds -> CInt -> IO CInt foreign import ccall unsafe "poll.h poll" c_poll_prim_array :: MutableByteArray# RealWorld -> CNfds -> CInt -> IO CInt -- | The @timeout@ argument is omitted since it is nonsense to choose -- anything other than 0 when using the unsafe FFI. uninterruptiblePoll :: Ptr PollFd -> CNfds -> IO (Either Errno CInt) uninterruptiblePoll pfds n = c_poll_ptr pfds n 0 >>= errorsFromInt uninterruptiblePollMutablePrimArray :: MutablePrimArray RealWorld PollFd -> CNfds -> IO (Either Errno CInt) uninterruptiblePollMutablePrimArray (MutablePrimArray pfds) n = c_poll_prim_array pfds n 0 >>= errorsFromInt errorsFromInt :: CInt -> IO (Either Errno CInt) errorsFromInt r = if r >= 0 then pure (Right r) else fmap Left getErrno