Lely core libraries  2.2.5
sigset.h
Go to the documentation of this file.
1 
22 #ifndef LELY_IO2_SIGSET_H_
23 #define LELY_IO2_SIGSET_H_
24 
25 #include <lely/ev/future.h>
26 #include <lely/ev/task.h>
27 #include <lely/io2/dev.h>
28 
29 #include <signal.h>
30 
31 #if _WIN32 && !defined(SIGHUP)
32 #define SIGHUP 1
33 #endif
34 
35 #ifndef LELY_IO_SIGSET_INLINE
36 #define LELY_IO_SIGSET_INLINE static inline
37 #endif
38 
40 typedef const struct io_sigset_vtbl *const io_sigset_t;
41 
48  struct ev_task task;
50  int signo;
51 };
52 
54 #define IO_SIGSET_WAIT_INIT(exec, func) \
55  { \
56  EV_TASK_INIT(exec, func), 0 \
57  }
58 
59 #ifdef __cplusplus
60 extern "C" {
61 #endif
62 
64  io_dev_t *(*get_dev)(const io_sigset_t *sigset);
65  int (*clear)(io_sigset_t *sigset);
66  int (*insert)(io_sigset_t *sigset, int signo);
67  int (*remove)(io_sigset_t *sigset, int signo);
68  void (*submit_wait)(io_sigset_t *sigset, struct io_sigset_wait *wait);
69 };
70 
72 static inline io_ctx_t *io_sigset_get_ctx(const io_sigset_t *sigset);
73 
75 static inline ev_exec_t *io_sigset_get_exec(const io_sigset_t *sigset);
76 
78 static inline size_t io_sigset_cancel(
79  io_sigset_t *sigset, struct ev_task *task);
80 
82 static inline size_t io_sigset_abort(io_sigset_t *sigset, struct ev_task *task);
83 
87 LELY_IO_SIGSET_INLINE io_dev_t *io_sigset_get_dev(const io_sigset_t *sigset);
88 
97 LELY_IO_SIGSET_INLINE int io_sigset_clear(io_sigset_t *sigset);
98 
108 LELY_IO_SIGSET_INLINE int io_sigset_insert(io_sigset_t *sigset, int signo);
109 
119 LELY_IO_SIGSET_INLINE int io_sigset_remove(io_sigset_t *sigset, int signo);
120 
125 LELY_IO_SIGSET_INLINE void io_sigset_submit_wait(
126  io_sigset_t *sigset, struct io_sigset_wait *wait);
127 
136 static inline size_t io_sigset_cancel_wait(
137  io_sigset_t *sigset, struct io_sigset_wait *wait);
138 
147 static inline size_t io_sigset_abort_wait(
148  io_sigset_t *sigset, struct io_sigset_wait *wait);
149 
166 ev_future_t *io_sigset_async_wait(io_sigset_t *sigset, ev_exec_t *exec,
167  struct io_sigset_wait **pwait);
172 struct io_sigset_wait *io_sigset_wait_from_task(struct ev_task *task);
173 
174 static inline io_ctx_t *
175 io_sigset_get_ctx(const io_sigset_t *sigset)
176 {
177  return io_dev_get_ctx(io_sigset_get_dev(sigset));
178 }
179 
180 static inline ev_exec_t *
181 io_sigset_get_exec(const io_sigset_t *sigset)
182 {
183  return io_dev_get_exec(io_sigset_get_dev(sigset));
184 }
185 
186 static inline size_t
187 io_sigset_cancel(io_sigset_t *sigset, struct ev_task *task)
188 {
189  return io_dev_cancel(io_sigset_get_dev(sigset), task);
190 }
191 
192 static inline size_t
193 io_sigset_abort(io_sigset_t *sigset, struct ev_task *task)
194 {
195  return io_dev_abort(io_sigset_get_dev(sigset), task);
196 }
197 
198 inline io_dev_t *
199 io_sigset_get_dev(const io_sigset_t *sigset)
200 {
201  return (*sigset)->get_dev(sigset);
202 }
203 
204 inline int
205 io_sigset_clear(io_sigset_t *sigset)
206 {
207  return (*sigset)->clear(sigset);
208 }
209 
210 inline int
211 io_sigset_insert(io_sigset_t *sigset, int signo)
212 {
213  return (*sigset)->insert(sigset, signo);
214 }
215 
216 inline int
217 io_sigset_remove(io_sigset_t *sigset, int signo)
218 {
219  return (*sigset)->remove(sigset, signo);
220 }
221 
222 inline void
223 io_sigset_submit_wait(io_sigset_t *sigset, struct io_sigset_wait *wait)
224 {
225  (*sigset)->submit_wait(sigset, wait);
226 }
227 
228 static inline size_t
229 io_sigset_cancel_wait(io_sigset_t *sigset, struct io_sigset_wait *wait)
230 {
231  return io_sigset_cancel(sigset, &wait->task);
232 }
233 
234 static inline size_t
235 io_sigset_abort_wait(io_sigset_t *sigset, struct io_sigset_wait *wait)
236 {
237  return io_sigset_abort(sigset, &wait->task);
238 }
239 
240 #ifdef __cplusplus
241 }
242 #endif
243 
244 #endif // !LELY_IO2_SIGSET_H_
const struct ev_exec_vtbl *const ev_exec_t
An abstract task executor.
Definition: ev.h:29
struct ev_task task
The task (to be) submitted upon completion (or cancellation) of the wait operation.
Definition: sigset.h:48
static size_t io_sigset_abort(io_sigset_t *sigset, struct ev_task *task)
Definition: sigset.h:193
ev_future_t * io_sigset_async_wait(io_sigset_t *sigset, ev_exec_t *exec, struct io_sigset_wait **pwait)
Submits an asynchronous wait operation to a signal handler and creates a future which becomes ready o...
Definition: sigset.c:39
const struct io_sigset_vtbl *const io_sigset_t
An abstract signal handler.
Definition: sigset.h:40
static ev_exec_t * io_sigset_get_exec(const io_sigset_t *sigset)
Definition: sigset.h:181
ev_exec_t * io_dev_get_exec(const io_dev_t *dev)
Returns a pointer to the executor used by the I/O device to execute asynchronous tasks.
Definition: dev.h:86
Definition: ctx.c:35
static size_t io_sigset_abort_wait(io_sigset_t *sigset, struct io_sigset_wait *wait)
Aborts the specified signal wait operation if it is pending.
Definition: sigset.h:235
int signo
The signal number, or 0 if the wait operation was canceled.
Definition: sigset.h:50
A future.
Definition: future.c:63
A wait operation suitable for use with a signal handler.
Definition: sigset.h:43
size_t io_dev_cancel(io_dev_t *dev, struct ev_task *task)
Cancels the asynchronous operation submitted to *dev, if its task has not yet been submitted to its e...
Definition: dev.h:92
int io_sigset_insert(io_sigset_t *sigset, int signo)
Insert the specified signal number into the set of signals being monitored by a signal handler...
Definition: sigset.h:211
static size_t io_sigset_cancel_wait(io_sigset_t *sigset, struct io_sigset_wait *wait)
Cancels the specified signal wait operation if it is pending.
Definition: sigset.h:229
void io_sigset_submit_wait(io_sigset_t *sigset, struct io_sigset_wait *wait)
Submits a wait operation to a signal handler.
Definition: sigset.h:223
static io_ctx_t * io_sigset_get_ctx(const io_sigset_t *sigset)
Definition: sigset.h:175
io_dev_t * io_sigset_get_dev(const io_sigset_t *sigset)
Returns a pointer to the abstract I/O device representing the signal handler.
Definition: sigset.h:199
This header file is part of the event library; it contains the futures and promises declarations...
size_t io_dev_abort(io_dev_t *dev, struct ev_task *task)
Aborts the asynchronous operation submitted to *dev, if its task has not yet been submitted to its ex...
Definition: dev.h:98
io_ctx_t * io_dev_get_ctx(const io_dev_t *dev)
Returns a pointer to the I/O context with which the I/O device is registered.
Definition: dev.h:80
This header file is part of the event library; it contains the task declarations. ...
int io_sigset_remove(io_sigset_t *sigset, int signo)
Removes the specified signal number from the set of signals being monitored by a signal handler...
Definition: sigset.h:217
An executable task.
Definition: task.h:41
static size_t io_sigset_cancel(io_sigset_t *sigset, struct ev_task *task)
Definition: sigset.h:187
int io_sigset_clear(io_sigset_t *sigset)
Clears the set of signals being monitored by a signal handler.
Definition: sigset.h:205
const struct io_dev_vtbl *const io_dev_t
An abstract I/O device.
Definition: dev.h:35
This header file is part of the I/O library; it contains the abstract I/O device interface.
struct io_sigset_wait * io_sigset_wait_from_task(struct ev_task *task)
Obtains a pointer to a signal wait operation from a pointer to its completion task.
Definition: sigset.c:61