aboutsummaryrefslogtreecommitdiff
path: root/include/poller.h
blob: 6b727c4e44efe7376e6c0e11fb703a6457a50281 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#ifndef _SEATD_POLLER_H
#define _SEATD_POLLER_H

#include <stdbool.h>
#include <stdint.h>

#include "list.h"

struct poller;
struct event_source_fd;
struct event_source_signal;

/*
 * These are the event types available from the poller.
 */
#define EVENT_READABLE 0x1
#define EVENT_WRITABLE 0x4
#define EVENT_ERROR    0x8
#define EVENT_HANGUP   0x10

/**
 * The callback type used by event_source_fd, passed to poller_add_fd.
 */
typedef int (*event_source_fd_func_t)(int fd, uint32_t mask, void *data);

/**
 * The interface that an event_source_fd must implement.
 */
struct event_source_fd_impl {
	int (*update)(struct event_source_fd *event_source, uint32_t mask);
	int (*destroy)(struct event_source_fd *event_source);
};

/**
 * The fd poller class. This must be created by poller_add_fd.
 */
struct event_source_fd {
	const struct event_source_fd_impl *impl;
	event_source_fd_func_t func;

	int fd;
	uint32_t mask;
	void *data;

	struct poller *poller;
	bool killed;
};

/**
 * Removes the event_source_fd from the poller and frees the structure.
 */
int event_source_fd_destroy(struct event_source_fd *event_source);

/**
 * Updates the poll mask applied to this fd, effective on the next poll.
 */
int event_source_fd_update(struct event_source_fd *event_source, uint32_t mask);

/**
 * The callback type used by event_source_signal, passed to poller_add_signal.
 */
typedef int (*event_source_signal_func_t)(int signal, void *data);

/**
 * The interface that an event_source_signal must implement.
 */
struct event_source_signal_impl {
	int (*destroy)(struct event_source_signal *event_source);
};

/*
 * The signal poller class. This must be created by poller_add_signal.
 */
struct event_source_signal {
	const struct event_source_signal_impl *impl;
	event_source_signal_func_t func;

	int signal;
	void *data;

	struct poller *poller;
	bool raised;
	bool killed;
};

/**
 * Removes the event_source_siganl from the poller and frees the structure.
 */
int event_source_signal_destroy(struct event_source_signal *event_source);

/**
 * The interface that a poll backend must implement.
 */
struct poll_impl {
	struct poller *(*create)(void);
	int (*destroy)(struct poller *);

	struct event_source_fd *(*add_fd)(struct poller *, int fd, uint32_t mask,
					  event_source_fd_func_t func, void *data);
	struct event_source_signal *(*add_signal)(struct poller *, int signal,
						  event_source_signal_func_t func, void *data);

	int (*poll)(struct poller *);
};

/**
 * The poller base class. This must be created by poller_create.
 */
struct poller {
	struct list signals;
	struct list new_signals;
	struct list fds;
	struct list new_fds;

	struct pollfd *pollfds;
	size_t pollfds_len;
	bool dirty;
	bool inpoll;
};

/**
 * Creates a poller with the best available polling backend. This poller must
 * be torn down with poller_destroy when it is no longer needed.
 */
/**
 * Initializes the poller. The poller must be torn down with poller_finish when
 * it is no longer needed.
 */
void poller_init(struct poller *poller);

/**
 * De-initializes the poller. This destroys all remaining event sources and
 * tears down the poller.
 */
int poller_finish(struct poller *poller);

/**
 * Create an fd event source with the provided initial parameters. This event
 * source must be torn down with event_source_fd_destroy when it is no longer
 * needed.
 */
struct event_source_fd *poller_add_fd(struct poller *poller, int fd, uint32_t mask,
				      event_source_fd_func_t func, void *data);

/**
 * Create  signal event source with the provided initial parameters. This event
 * source must be torn down with event_source_signal_destroy when it is no
 * longer needed.
 */
struct event_source_signal *poller_add_signal(struct poller *poller, int signal,
					      event_source_signal_func_t func, void *data);

/**
 * Poll the poller. I don't know what you were expecting.
 */
int poller_poll(struct poller *poller);

#endif