]> git.proxmox.com Git - systemd.git/blame - src/systemd/sd-event.h
New upstream version 236
[systemd.git] / src / systemd / sd-event.h
CommitLineData
52ad194e 1/* SPDX-License-Identifier: LGPL-2.1+ */
60f067b4
JS
2#ifndef foosdeventhfoo
3#define foosdeventhfoo
4
5/***
6 This file is part of systemd.
7
8 Copyright 2013 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
60f067b4
JS
24#include <inttypes.h>
25#include <signal.h>
4c89c718
MP
26#include <sys/epoll.h>
27#include <sys/signalfd.h>
28#include <sys/types.h>
60f067b4
JS
29
30#include "_sd-common.h"
31
32/*
33 Why is this better than pure epoll?
34
35 - Supports event source prioritization
36 - Scales better with a large number of time events because it does not require one timerfd each
37 - Automatically tries to coalesce timer events system-wide
38 - Handles signals and child PIDs
39*/
40
41_SD_BEGIN_DECLARATIONS;
42
43typedef struct sd_event sd_event;
44typedef struct sd_event_source sd_event_source;
45
46enum {
47 SD_EVENT_OFF = 0,
48 SD_EVENT_ON = 1,
49 SD_EVENT_ONESHOT = -1
50};
51
52enum {
e3bff60a
MP
53 SD_EVENT_INITIAL,
54 SD_EVENT_ARMED,
5eef597e 55 SD_EVENT_PENDING,
60f067b4
JS
56 SD_EVENT_RUNNING,
57 SD_EVENT_EXITING,
4c89c718 58 SD_EVENT_FINISHED,
aa27b158 59 SD_EVENT_PREPARING
60f067b4
JS
60};
61
62enum {
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
69typedef int (*sd_event_handler_t)(sd_event_source *s, void *userdata);
70typedef int (*sd_event_io_handler_t)(sd_event_source *s, int fd, uint32_t revents, void *userdata);
71typedef int (*sd_event_time_handler_t)(sd_event_source *s, uint64_t usec, void *userdata);
72typedef int (*sd_event_signal_handler_t)(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata);
81c58355 73#if defined _GNU_SOURCE || _POSIX_C_SOURCE >= 199309L
60f067b4 74typedef int (*sd_event_child_handler_t)(sd_event_source *s, const siginfo_t *si, void *userdata);
aa27b158
MP
75#else
76typedef void* sd_event_child_handler_t;
77#endif
60f067b4
JS
78
79int sd_event_default(sd_event **e);
80
81int sd_event_new(sd_event **e);
82sd_event* sd_event_ref(sd_event *e);
83sd_event* sd_event_unref(sd_event *e);
84
85int sd_event_add_io(sd_event *e, sd_event_source **s, int fd, uint32_t events, sd_event_io_handler_t callback, void *userdata);
86int 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);
87int sd_event_add_signal(sd_event *e, sd_event_source **s, int sig, sd_event_signal_handler_t callback, void *userdata);
88int sd_event_add_child(sd_event *e, sd_event_source **s, pid_t pid, int options, sd_event_child_handler_t callback, void *userdata);
89int sd_event_add_defer(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
90int sd_event_add_post(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
91int sd_event_add_exit(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
92
5eef597e 93int sd_event_prepare(sd_event *e);
4c89c718 94int sd_event_wait(sd_event *e, uint64_t usec);
5eef597e 95int sd_event_dispatch(sd_event *e);
4c89c718 96int sd_event_run(sd_event *e, uint64_t usec);
60f067b4
JS
97int sd_event_loop(sd_event *e);
98int sd_event_exit(sd_event *e, int code);
99
100int sd_event_now(sd_event *e, clockid_t clock, uint64_t *usec);
101
5eef597e 102int sd_event_get_fd(sd_event *e);
60f067b4
JS
103int sd_event_get_state(sd_event *e);
104int sd_event_get_tid(sd_event *e, pid_t *tid);
105int sd_event_get_exit_code(sd_event *e, int *code);
106int sd_event_set_watchdog(sd_event *e, int b);
107int sd_event_get_watchdog(sd_event *e);
5a920b42 108int sd_event_get_iteration(sd_event *e, uint64_t *ret);
60f067b4
JS
109
110sd_event_source* sd_event_source_ref(sd_event_source *s);
111sd_event_source* sd_event_source_unref(sd_event_source *s);
112
113sd_event *sd_event_source_get_event(sd_event_source *s);
114void* sd_event_source_get_userdata(sd_event_source *s);
115void* sd_event_source_set_userdata(sd_event_source *s, void *userdata);
116
f47781d8
MP
117int sd_event_source_set_description(sd_event_source *s, const char *description);
118int sd_event_source_get_description(sd_event_source *s, const char **description);
60f067b4
JS
119int sd_event_source_set_prepare(sd_event_source *s, sd_event_handler_t callback);
120int sd_event_source_get_pending(sd_event_source *s);
121int sd_event_source_get_priority(sd_event_source *s, int64_t *priority);
122int sd_event_source_set_priority(sd_event_source *s, int64_t priority);
123int sd_event_source_get_enabled(sd_event_source *s, int *enabled);
124int sd_event_source_set_enabled(sd_event_source *s, int enabled);
125int sd_event_source_get_io_fd(sd_event_source *s);
126int sd_event_source_set_io_fd(sd_event_source *s, int fd);
127int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events);
128int sd_event_source_set_io_events(sd_event_source *s, uint32_t events);
129int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents);
130int sd_event_source_get_time(sd_event_source *s, uint64_t *usec);
131int sd_event_source_set_time(sd_event_source *s, uint64_t usec);
132int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec);
133int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec);
134int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock);
135int sd_event_source_get_signal(sd_event_source *s);
136int sd_event_source_get_child_pid(sd_event_source *s, pid_t *pid);
137
4c89c718
MP
138/* Define helpers so that __attribute__((cleanup(sd_event_unrefp))) and similar may be used. */
139_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event, sd_event_unref);
140_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event_source, sd_event_source_unref);
141
60f067b4
JS
142_SD_END_DECLARATIONS;
143
144#endif