summaryrefslogtreecommitdiff
path: root/src/libmowgli/eventloop/pollable.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmowgli/eventloop/pollable.c')
-rw-r--r--src/libmowgli/eventloop/pollable.c62
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);
+}