module Network.Libev
(
EvLoopPtr
, evDefaultLoop
, evLoopNew
, evLoop
, evUnloop
, evLoopDestroy
, CEvLoopFlagType
, evloop_nonblock
, evloop_oneshot
, CEvUnloopFlagType
, evunloop_cancel
, evunloop_one
, evunloop_all
, CEvFlagType
, evRecommendedBackends
, evflag_auto
, evflag_noenv
, evflag_forkcheck
, evflag_noinotify
, evflag_nosigfd
, evflag_signalfd
, CEvBackendFlagType
, evbackend_select
, evbackend_poll
, evbackend_epoll
, evbackend_kqueue
, evbackend_devpoll
, evbackend_port
, evbackend_all
, MutexCallback
, setupLockingForLoop
, freeMutexCallback
, CEventType
, ev_undef
, ev_none
, ev_read
, ev_write
, ev__iofdset
, ev_io
, ev_timeout
, ev_timer
, ev_periodic
, ev_signal
, ev_child
, ev_stat
, ev_idle
, ev_prepare
, ev_check
, ev_embed
, ev_fork
, ev_async
, ev_custom
, ev_error
, EvIoPtr
, IoCallback
, mkEvIo
, freeEvIo
, mkIoCallback
, freeIoCallback
, evIoInit
, evIoStart
, evIoStop
, EvTimer
, EvTimerPtr
, TimerCallback
, mkEvTimer
, freeEvTimer
, mkTimerCallback
, freeTimerCallback
, evTimerInit
, evTimerStart
, evTimerStop
, evTimerAgain
, evTimerRemaining
, evTimerSetRepeat
, EvAsyncPtr
, AsyncCallback
, mkEvAsync
, freeEvAsync
, evAsyncInit
, evAsyncSend
, evAsyncStart
, evAsyncStop
, mkAsyncCallback
, freeAsyncCallback
, EvTimestamp
, evNow
, evTime
, c_accept
, c_close
, c_read
, c_write
, c_setnonblocking
)
where
import Control.Concurrent.MVar
import Prelude hiding (repeat)
import Foreign
import Foreign.C
type CEventType = CInt
ev_undef :: CEventType
ev_undef = 4294967295
ev_none :: CEventType
ev_none = 0
ev_read :: CEventType
ev_read = 1
ev_write :: CEventType
ev_write = 2
ev__iofdset :: CEventType
ev__iofdset = 128
ev_io :: CEventType
ev_io = 1
ev_timeout :: CEventType
ev_timeout = 256
ev_timer :: CEventType
ev_timer = 256
ev_periodic :: CEventType
ev_periodic = 512
ev_signal :: CEventType
ev_signal = 1024
ev_child :: CEventType
ev_child = 2048
ev_stat :: CEventType
ev_stat = 4096
ev_idle :: CEventType
ev_idle = 8192
ev_prepare :: CEventType
ev_prepare = 16384
ev_check :: CEventType
ev_check = 32768
ev_embed :: CEventType
ev_embed = 65536
ev_fork :: CEventType
ev_fork = 131072
ev_async :: CEventType
ev_async = 524288
ev_custom :: CEventType
ev_custom = 16777216
ev_error :: CEventType
ev_error = 2147483648
type CEvFlagType = CInt
evflag_auto :: CEvFlagType
evflag_auto = 0
evflag_noenv :: CEvFlagType
evflag_noenv = 16777216
evflag_forkcheck :: CEvFlagType
evflag_forkcheck = 33554432
evflag_noinotify :: CEvFlagType
evflag_noinotify = 1048576
evflag_nosigfd :: CEvFlagType
evflag_nosigfd = 0
evflag_signalfd :: CEvFlagType
evflag_signalfd = 2097152
type CEvBackendFlagType = CInt
evbackend_select :: CEvBackendFlagType
evbackend_select = 1
evbackend_poll :: CEvBackendFlagType
evbackend_poll = 2
evbackend_epoll :: CEvBackendFlagType
evbackend_epoll = 4
evbackend_kqueue :: CEvBackendFlagType
evbackend_kqueue = 8
evbackend_devpoll :: CEvBackendFlagType
evbackend_devpoll = 16
evbackend_port :: CEvBackendFlagType
evbackend_port = 32
evbackend_all :: CEvBackendFlagType
evbackend_all = 63
type CEvLoopFlagType = CInt
evloop_nonblock :: CEvLoopFlagType
evloop_nonblock = 1
evloop_oneshot :: CEvLoopFlagType
evloop_oneshot = 2
type CEvUnloopFlagType = CInt
evunloop_cancel :: CEvUnloopFlagType
evunloop_cancel = 0
evunloop_one :: CEvUnloopFlagType
evunloop_one = 1
evunloop_all :: CEvUnloopFlagType
evunloop_all = 2
data EvLoop
type EvLoopPtr = Ptr EvLoop
data EvWatcher
type EvWatcherPtr = Ptr EvWatcher
data EvIo = EvIo { fd :: CInt, events :: CInt }
type EvIoPtr = Ptr EvIo
data EvTimer = EvTimer { repeat :: Double }
type EvTimerPtr = Ptr EvTimer
data EvAsync
type EvAsyncPtr = Ptr EvAsync
instance Storable EvWatcher where
sizeOf _ = ((20))
alignment _ = alignment (undefined :: CInt)
instance Storable EvIo where
sizeOf _ = (32)
alignment _ = alignment (undefined :: CInt)
peek ptr = do
fd' <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) ptr
events' <- ((\hsc_ptr -> peekByteOff hsc_ptr 28)) ptr
return EvIo { fd = fd', events = events' }
poke ptr (EvIo fd' events') = do
((\hsc_ptr -> pokeByteOff hsc_ptr 24)) ptr fd'
((\hsc_ptr -> pokeByteOff hsc_ptr 28)) ptr events'
instance Storable EvTimer where
sizeOf _ = ((36))
alignment _ = alignment (undefined :: CInt)
peek ptr = do
repeat' <- ((\hsc_ptr -> peekByteOff hsc_ptr 28)) ptr
return EvTimer { repeat = repeat' }
poke ptr (EvTimer repeat') = do
((\hsc_ptr -> pokeByteOff hsc_ptr 28)) ptr repeat'
instance Storable EvAsync where
sizeOf _ = ((24))
alignment _ = alignment (undefined :: CInt)
type IoCallback = EvLoopPtr -> EvIoPtr -> CEventType -> IO ()
type TimerCallback = EvLoopPtr -> EvTimerPtr -> CEventType -> IO ()
type AsyncCallback = EvLoopPtr -> EvAsyncPtr -> CEventType -> IO ()
type MutexCallback = EvLoopPtr -> IO ()
type EvTimestamp = CDouble
setupLockingForLoop :: EvLoopPtr
-> IO (FunPtr MutexCallback, FunPtr MutexCallback, MVar ())
setupLockingForLoop loop = do
mvar <- newMVar ()
acq <- mkMutexCallback $ acquire mvar
rel <- mkMutexCallback $ release mvar
evSetLoopReleaseCB loop rel acq
return (rel, acq, mvar)
where
release mvar _ = putMVar mvar ()
acquire mvar _ = takeMVar mvar
foreign import ccall safe "ev_set_loop_release_cb"
evSetLoopReleaseCB :: EvLoopPtr
-> FunPtr MutexCallback
-> FunPtr MutexCallback
-> IO ()
foreign import ccall unsafe "ev.h ev_recommended_backends" evRecommendedBackends :: IO CEvFlagType
foreign import ccall unsafe "wev_default_loop" evDefaultLoop :: CInt -> IO EvLoopPtr
foreign import ccall "wev_loop" evLoop :: EvLoopPtr -> CInt -> IO ()
foreign import ccall "wev_unloop" evUnloop :: EvLoopPtr -> CInt -> IO ()
foreign import ccall unsafe "wev_loop_new" evLoopNew :: CUInt -> IO EvLoopPtr
foreign import ccall unsafe "wev_loop_destroy" evLoopDestroy :: EvLoopPtr -> IO ()
foreign import ccall unsafe "wev_io_init" evIoInit :: EvIoPtr -> FunPtr IoCallback -> CInt -> CEventType -> IO ()
foreign import ccall unsafe "wev_io_start" evIoStart :: EvLoopPtr -> EvIoPtr -> IO ()
foreign import ccall unsafe "wev_io_stop" evIoStop :: EvLoopPtr -> EvIoPtr -> IO ()
foreign import ccall unsafe "wev_async_init" evAsyncInit :: EvAsyncPtr
-> FunPtr AsyncCallback
-> IO ()
foreign import ccall unsafe "wev_async_send" evAsyncSend :: EvLoopPtr
-> EvAsyncPtr
-> IO ()
foreign import ccall unsafe "wev_async_start" evAsyncStart :: EvLoopPtr
-> EvAsyncPtr
-> IO ()
foreign import ccall unsafe "wev_async_stop" evAsyncStop :: EvLoopPtr
-> EvAsyncPtr
-> IO ()
foreign import ccall unsafe "wev_timer_init" evTimerInit :: EvTimerPtr -> FunPtr TimerCallback -> EvTimestamp -> EvTimestamp -> IO ()
foreign import ccall unsafe "wev_timer_set" evTimerSet :: EvTimerPtr -> EvTimestamp -> EvTimestamp -> IO ()
foreign import ccall unsafe "wev_timer_start" evTimerStart :: EvLoopPtr -> EvTimerPtr -> IO ()
foreign import ccall unsafe "wev_timer_stop" evTimerStop :: EvLoopPtr -> EvTimerPtr -> IO ()
foreign import ccall unsafe "wev_timer_again" evTimerAgain :: EvLoopPtr -> EvTimerPtr -> IO ()
foreign import ccall unsafe "wev_timer_remaining" evTimerRemaining :: EvLoopPtr -> EvTimerPtr -> IO (EvTimestamp)
foreign import ccall unsafe "unistd.h close" c_close :: CInt -> IO (CInt)
foreign import ccall unsafe "unistd.h read" c_read :: CInt -> CString -> CSize -> IO (CSize)
foreign import ccall unsafe "unistd.h write" c_write :: CInt -> CString -> CSize -> IO (CSize)
foreign import ccall unsafe "c_accept" c_accept :: CInt -> IO (CInt)
foreign import ccall unsafe "set_nonblocking" c_setnonblocking :: CInt -> IO ()
foreign import ccall unsafe "ev.h ev_time" evTime :: IO EvTimestamp
foreign import ccall unsafe "ev.h ev_now" evNow :: EvLoopPtr -> IO EvTimestamp
foreign import ccall "wrapper" mkIoCallback :: IoCallback
-> IO (FunPtr IoCallback)
foreign import ccall "wrapper" mkTimerCallback :: TimerCallback
-> IO (FunPtr TimerCallback)
foreign import ccall "wrapper" mkAsyncCallback :: AsyncCallback
-> IO (FunPtr AsyncCallback)
foreign import ccall "wrapper" mkMutexCallback :: MutexCallback
-> IO (FunPtr MutexCallback)
freeIoCallback :: FunPtr IoCallback -> IO ()
freeIoCallback = freeHaskellFunPtr
freeMutexCallback :: FunPtr MutexCallback -> IO ()
freeMutexCallback = freeHaskellFunPtr
freeTimerCallback :: FunPtr TimerCallback -> IO ()
freeTimerCallback = freeHaskellFunPtr
freeAsyncCallback :: FunPtr AsyncCallback -> IO ()
freeAsyncCallback = freeHaskellFunPtr
mkEvIo :: IO (EvIoPtr)
mkEvIo = malloc
freeEvIo :: EvIoPtr -> IO ()
freeEvIo = free
mkEvTimer :: IO (EvTimerPtr)
mkEvTimer = malloc
evTimerSetRepeat :: EvTimerPtr -> Double -> IO ()
evTimerSetRepeat p t = do
evtimer <- peek p
poke p evtimer { repeat = t }
freeEvTimer :: EvTimerPtr -> IO ()
freeEvTimer = free
mkEvAsync :: IO (EvAsyncPtr)
mkEvAsync = malloc
freeEvAsync :: EvAsyncPtr -> IO ()
freeEvAsync = free