chiark / gitweb /
timedated: use libsystemd-bus instead of libdbus for bus communication
[elogind.git] / src / systemd / sd-event.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #ifndef foosdeventhfoo
4 #define foosdeventhfoo
5
6 /***
7   This file is part of systemd.
8
9   Copyright 2013 Lennart Poettering
10
11   systemd is free software; you can redistribute it and/or modify it
12   under the terms of the GNU Lesser General Public License as published by
13   the Free Software Foundation; either version 2.1 of the License, or
14   (at your option) any later version.
15
16   systemd is distributed in the hope that it will be useful, but
17   WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19   Lesser General Public License for more details.
20
21   You should have received a copy of the GNU Lesser General Public License
22   along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 ***/
24
25 #include <sys/types.h>
26 #include <sys/signalfd.h>
27 #include <sys/epoll.h>
28 #include <inttypes.h>
29 #include <signal.h>
30
31 /*
32   Why is this better than pure epoll?
33
34   - Supports event source priorisation
35   - Scales better with a large number of time events, since it doesn't require one timerfd each
36   - Automatically tries to coalesce timer events system-wide
37   - Handles signals and child PIDs
38 */
39
40 typedef struct sd_event sd_event;
41 typedef struct sd_event_source sd_event_source;
42
43 enum {
44         SD_EVENT_OFF = 0,
45         SD_EVENT_ON = 1,
46         SD_EVENT_ONESHOT = -1
47 };
48
49 enum {
50         SD_EVENT_PASSIVE,
51         SD_EVENT_RUNNING,
52         SD_EVENT_QUITTING,
53         SD_EVENT_FINISHED
54 };
55
56 typedef int (*sd_io_handler_t)(sd_event_source *s, int fd, uint32_t revents, void *userdata);
57 typedef int (*sd_time_handler_t)(sd_event_source *s, uint64_t usec, void *userdata);
58 typedef int (*sd_signal_handler_t)(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata);
59 typedef int (*sd_child_handler_t)(sd_event_source *s, const siginfo_t *si, void *userdata);
60 typedef int (*sd_defer_handler_t)(sd_event_source *s, void *userdata);
61 typedef int (*sd_prepare_handler_t)(sd_event_source *s, void *userdata);
62 typedef int (*sd_quit_handler_t)(sd_event_source *s, void *userdata);
63
64 int sd_event_new(sd_event **e);
65 sd_event* sd_event_ref(sd_event *e);
66 sd_event* sd_event_unref(sd_event *e);
67
68 int sd_event_add_io(sd_event *e, int fd, uint32_t events, sd_io_handler_t callback, void *userdata, sd_event_source **s);
69 int sd_event_add_monotonic(sd_event *e, uint64_t usec, uint64_t accuracy, sd_time_handler_t callback, void *userdata, sd_event_source **s);
70 int sd_event_add_realtime(sd_event *e, uint64_t usec, uint64_t accuracy, sd_time_handler_t callback, void *userdata, sd_event_source **s);
71 int sd_event_add_signal(sd_event *e, int sig, sd_signal_handler_t callback, void *userdata, sd_event_source **s);
72 int sd_event_add_child(sd_event *e, pid_t pid, int options, sd_child_handler_t callback, void *userdata, sd_event_source **s);
73 int sd_event_add_defer(sd_event *e, sd_defer_handler_t callback, void *userdata, sd_event_source **s);
74 int sd_event_add_quit(sd_event *e, sd_quit_handler_t callback, void *userdata, sd_event_source **s);
75
76 int sd_event_run(sd_event *e, uint64_t timeout);
77 int sd_event_loop(sd_event *e);
78
79 int sd_event_get_state(sd_event *e);
80 int sd_event_get_quit(sd_event *e);
81 int sd_event_request_quit(sd_event *e);
82 int sd_event_get_now_realtime(sd_event *e, uint64_t *usec);
83 int sd_event_get_now_monotonic(sd_event *e, uint64_t *usec);
84 sd_event *sd_event_get(sd_event_source *s);
85
86 sd_event_source* sd_event_source_ref(sd_event_source *s);
87 sd_event_source* sd_event_source_unref(sd_event_source *s);
88
89 int sd_event_source_set_prepare(sd_event_source *s, sd_prepare_handler_t callback);
90 int sd_event_source_get_pending(sd_event_source *s);
91 int sd_event_source_get_priority(sd_event_source *s, int *priority);
92 int sd_event_source_set_priority(sd_event_source *s, int priority);
93 int sd_event_source_get_enabled(sd_event_source *s, int *enabled);
94 int sd_event_source_set_enabled(sd_event_source *s, int enabled);
95 void* sd_event_source_get_userdata(sd_event_source *s);
96 int sd_event_source_get_io_fd(sd_event_source *s);
97 int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events);
98 int sd_event_source_set_io_events(sd_event_source *s, uint32_t events);
99 int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents);
100 int sd_event_source_get_time(sd_event_source *s, uint64_t *usec);
101 int sd_event_source_set_time(sd_event_source *s, uint64_t usec);
102 int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec);
103 int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec);
104 int sd_event_source_get_signal(sd_event_source *s);
105 int sd_event_source_get_child_pid(sd_event_source *s, pid_t *pid);
106
107 #endif