diff options
Diffstat (limited to 'src/systemd/sd-event.h')
-rw-r--r-- | src/systemd/sd-event.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/systemd/sd-event.h b/src/systemd/sd-event.h new file mode 100644 index 0000000000..bec41cff6d --- /dev/null +++ b/src/systemd/sd-event.h @@ -0,0 +1,97 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#ifndef foosdeventhfoo +#define foosdeventhfoo + +/*** + This file is part of systemd. + + Copyright 2013 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include <sys/types.h> +#include <sys/signalfd.h> +#include <sys/epoll.h> +#include <inttypes.h> +#include <signal.h> + +/* + Why is this better than pure epoll? + + - Supports event source priorisation + - Scales better with a large number of time events, since it doesn't require one timerfd each + - Handles signals and child PIDs + + TODO: + + - Detect forks and return ECHILD + - Timer events with accuracy for coalescing time events +*/ + +typedef struct sd_event sd_event; +typedef struct sd_event_source sd_event_source; + +typedef enum sd_event_mute { + SD_EVENT_MUTED = 0, + SD_EVENT_UNMUTED = 1, + SD_EVENT_ONESHOT = -1 +} sd_event_mute_t; + +typedef int (*sd_io_handler_t)(sd_event_source *s, int fd, uint32_t revents, void *userdata); +typedef int (*sd_time_handler_t)(sd_event_source *s, uint64_t usec, void *userdata); +typedef int (*sd_signal_handler_t)(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata); +typedef int (*sd_child_handler_t)(sd_event_source *s, const siginfo_t *si, void *userdata); +typedef int (*sd_defer_handler_t)(sd_event_source *s, void *userdata); +typedef int (*sd_prepare_handler_t)(sd_event_source *s, void *userdata); + +int sd_event_new(sd_event **e); +sd_event* sd_event_ref(sd_event *e); +sd_event* sd_event_unref(sd_event *e); + +int sd_event_add_io(sd_event *e, int fd, uint32_t events, sd_io_handler_t callback, void *userdata, sd_event_source **s); +int sd_event_add_monotonic(sd_event *e, uint64_t usec, sd_time_handler_t callback, void *userdata, sd_event_source **s); +int sd_event_add_realtime(sd_event *e, uint64_t usec, sd_time_handler_t callback, void *userdata, sd_event_source **s); +int sd_event_add_signal(sd_event *e, int sig, sd_signal_handler_t callback, void *userdata, sd_event_source **s); +int sd_event_add_child(sd_event *e, pid_t pid, int options, sd_child_handler_t callback, void *userdata, sd_event_source **s); +int sd_event_add_defer(sd_event *e, sd_defer_handler_t callback, void *userdata, sd_event_source **s); + +int sd_event_run(sd_event *e, uint64_t timeout); +int sd_event_loop(sd_event *e); + +int sd_event_quit(sd_event *e); +int sd_event_request_quit(sd_event *e); + +sd_event *sd_event_get(sd_event_source *s); + +sd_event_source* sd_event_source_ref(sd_event_source *s); +sd_event_source* sd_event_source_unref(sd_event_source *s); + +int sd_event_source_get_pending(sd_event_source *s); +int sd_event_source_get_io_fd(sd_event_source *s); +int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events); +int sd_event_source_set_io_events(sd_event_source *s, uint32_t events); +int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents); +int sd_event_source_get_signal(sd_event_source *s); +int sd_event_source_get_priority(sd_event_source *s, int *priority); +int sd_event_source_set_priority(sd_event_source *s, int priority); +int sd_event_source_get_mute(sd_event_source *s, sd_event_mute_t *m); +int sd_event_source_set_mute(sd_event_source *s, sd_event_mute_t m); +int sd_event_source_get_time(sd_event_source *s, uint64_t *usec); +int sd_event_source_set_time(sd_event_source *s, uint64_t usec); +int sd_event_source_set_prepare(sd_event_source *s, sd_prepare_handler_t callback); +void* sd_event_source_get_userdata(sd_event_source *s); + +#endif |