chiark / gitweb /
sd-rtnl: add support to set packet family type
[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 #include "_sd-common.h"
32
33 /*
34   Why is this better than pure epoll?
35
36   - Supports event source prioritization
37   - Scales better with a large number of time events because it does not require one timerfd each
38   - Automatically tries to coalesce timer events system-wide
39   - Handles signals and child PIDs
40 */
41
42 _SD_BEGIN_DECLARATIONS;
43
44 typedef struct sd_event sd_event;
45 typedef struct sd_event_source sd_event_source;
46
47 enum {
48         SD_EVENT_OFF = 0,
49         SD_EVENT_ON = 1,
50         SD_EVENT_ONESHOT = -1
51 };
52
53 enum {
54         SD_EVENT_PASSIVE,
55         SD_EVENT_PREPARED,
56         SD_EVENT_PENDING,
57         SD_EVENT_RUNNING,
58         SD_EVENT_EXITING,
59         SD_EVENT_FINISHED
60 };
61
62 enum {
63         /* And everything in-between and outside is good too */
64         SD_EVENT_PRIORITY_IMPORTANT = -100,
65         SD_EVENT_PRIORITY_NORMAL = 0,
66         SD_EVENT_PRIORITY_IDLE = 100
67 };
68
69 typedef int (*sd_event_handler_t)(sd_event_source *s, void *userdata);
70 typedef int (*sd_event_io_handler_t)(sd_event_source *s, int fd, uint32_t revents, void *userdata);
71 typedef int (*sd_event_time_handler_t)(sd_event_source *s, uint64_t usec, void *userdata);
72 typedef int (*sd_event_signal_handler_t)(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata);
73 typedef int (*sd_event_child_handler_t)(sd_event_source *s, const siginfo_t *si, void *userdata);
74
75 int sd_event_default(sd_event **e);
76
77 int sd_event_new(sd_event **e);
78 sd_event* sd_event_ref(sd_event *e);
79 sd_event* sd_event_unref(sd_event *e);
80
81 int sd_event_add_io(sd_event *e, sd_event_source **s, int fd, uint32_t events, sd_event_io_handler_t callback, void *userdata);
82 int sd_event_add_time(sd_event *e, sd_event_source **s, clockid_t clock, uint64_t usec, uint64_t accuracy, sd_event_time_handler_t callback, void *userdata);
83 int sd_event_add_signal(sd_event *e, sd_event_source **s, int sig, sd_event_signal_handler_t callback, void *userdata);
84 int sd_event_add_child(sd_event *e, sd_event_source **s, pid_t pid, int options, sd_event_child_handler_t callback, void *userdata);
85 int sd_event_add_defer(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
86 int sd_event_add_post(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
87 int sd_event_add_exit(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
88
89 int sd_event_prepare(sd_event *e);
90 int sd_event_wait(sd_event *e, uint64_t timeout);
91 int sd_event_dispatch(sd_event *e);
92 int sd_event_run(sd_event *e, uint64_t timeout);
93 int sd_event_loop(sd_event *e);
94 int sd_event_exit(sd_event *e, int code);
95
96 int sd_event_now(sd_event *e, clockid_t clock, uint64_t *usec);
97
98 int sd_event_get_fd(sd_event *e);
99 int sd_event_get_state(sd_event *e);
100 int sd_event_get_tid(sd_event *e, pid_t *tid);
101 int sd_event_get_exit_code(sd_event *e, int *code);
102 int sd_event_set_watchdog(sd_event *e, int b);
103 int sd_event_get_watchdog(sd_event *e);
104
105 sd_event_source* sd_event_source_ref(sd_event_source *s);
106 sd_event_source* sd_event_source_unref(sd_event_source *s);
107
108 sd_event *sd_event_source_get_event(sd_event_source *s);
109 void* sd_event_source_get_userdata(sd_event_source *s);
110 void* sd_event_source_set_userdata(sd_event_source *s, void *userdata);
111
112 int sd_event_source_set_name(sd_event_source *s, const char *name);
113 int sd_event_source_get_name(sd_event_source *s, const char **name);
114 int sd_event_source_set_prepare(sd_event_source *s, sd_event_handler_t callback);
115 int sd_event_source_get_pending(sd_event_source *s);
116 int sd_event_source_get_priority(sd_event_source *s, int64_t *priority);
117 int sd_event_source_set_priority(sd_event_source *s, int64_t priority);
118 int sd_event_source_get_enabled(sd_event_source *s, int *enabled);
119 int sd_event_source_set_enabled(sd_event_source *s, int enabled);
120 int sd_event_source_get_io_fd(sd_event_source *s);
121 int sd_event_source_set_io_fd(sd_event_source *s, int fd);
122 int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events);
123 int sd_event_source_set_io_events(sd_event_source *s, uint32_t events);
124 int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents);
125 int sd_event_source_get_time(sd_event_source *s, uint64_t *usec);
126 int sd_event_source_set_time(sd_event_source *s, uint64_t usec);
127 int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec);
128 int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec);
129 int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock);
130 int sd_event_source_get_signal(sd_event_source *s);
131 int sd_event_source_get_child_pid(sd_event_source *s, pid_t *pid);
132
133 _SD_END_DECLARATIONS;
134
135 #endif