diff options
Diffstat (limited to 'src/libmowgli/eventloop/pollable.c')
-rw-r--r-- | src/libmowgli/eventloop/pollable.c | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/src/libmowgli/eventloop/pollable.c b/src/libmowgli/eventloop/pollable.c index e2c2e2a..5f9526e 100644 --- a/src/libmowgli/eventloop/pollable.c +++ b/src/libmowgli/eventloop/pollable.c @@ -22,7 +22,8 @@ static mowgli_heap_t *pollable_heap = NULL; -mowgli_eventloop_pollable_t *mowgli_pollable_create(mowgli_eventloop_t *eventloop, mowgli_descriptor_t fd, void *userdata) +mowgli_eventloop_pollable_t * +mowgli_pollable_create(mowgli_eventloop_t *eventloop, mowgli_descriptor_t fd, void *userdata) { mowgli_eventloop_pollable_t *pollable; @@ -41,7 +42,8 @@ mowgli_eventloop_pollable_t *mowgli_pollable_create(mowgli_eventloop_t *eventloo return pollable; } -void mowgli_pollable_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable) +void +mowgli_pollable_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable) { return_if_fail(eventloop != NULL); return_if_fail(pollable != NULL); @@ -52,7 +54,8 @@ void mowgli_pollable_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pol mowgli_heap_free(pollable_heap, pollable); } -void mowgli_pollable_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function) +void +mowgli_pollable_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function) { return_if_fail(eventloop != NULL); return_if_fail(pollable != NULL); @@ -61,7 +64,8 @@ void mowgli_pollable_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_p eventloop->eventloop_ops->setselect(eventloop, pollable, dir, event_function); } -void mowgli_pollable_set_nonblocking(mowgli_eventloop_pollable_t *pollable, bool nonblocking) +void +mowgli_pollable_set_nonblocking(mowgli_eventloop_pollable_t *pollable, bool nonblocking) { #if defined(HAVE_FCNTL) unsigned long flags; @@ -86,3 +90,53 @@ void mowgli_pollable_set_nonblocking(mowgli_eventloop_pollable_t *pollable, bool ioctlsocket(pollable->fd, FIONBIO, &mode); #endif } + +void +mowgli_pollable_set_cloexec(mowgli_eventloop_pollable_t *pollable, bool cloexec) +{ +#if defined(FD_CLOEXEC) + unsigned long flags; + + return_if_fail(pollable != NULL); + + flags = fcntl(pollable->fd, F_GETFD); + + if (cloexec) + flags |= FD_CLOEXEC; + else + flags &= ~FD_CLOEXEC; + + fcntl(pollable->fd, F_SETFD, flags); +#elif defined(HAVE_WINSOCK2_H) + return_if_fail(pollable != NULL); + + SetHandleInformation((HANDLE)pollable->fd, HANDLE_FLAG_INHERIT, !cloexec); +#endif +} + +void +mowgli_pollable_trigger(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir) +{ + mowgli_eventloop_io_cb_t *event_function; + + return_if_fail(eventloop != NULL); + return_if_fail(pollable != NULL); + + switch (dir) + { + case MOWGLI_EVENTLOOP_IO_READ: + event_function = pollable->read_function; + break; + case MOWGLI_EVENTLOOP_IO_WRITE: + event_function = pollable->write_function; + break; + default: + event_function = NULL; + return; + } + + if (event_function == NULL) + return; + + event_function(eventloop, pollable, dir, pollable->userdata); +} |