1 /*
2 * Copyright © 2008 Kristian Høgsberg
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial
14 * portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 */
25
26 #include <assert.h>
27 #include <stddef.h>
28 #include <stdio.h>
29 #include <errno.h>
30 #include <signal.h>
31 #include <stdlib.h>
32 #include <stdint.h>
33 #include <stdbool.h>
34 #include <string.h>
35 #include <fcntl.h>
36 #include <sys/socket.h>
37 #include <sys/un.h>
38 #include <sys/epoll.h>
39 #include <sys/signalfd.h>
40 #include <sys/timerfd.h>
41 #include <unistd.h>
42 #include "wayland-util.h"
43 #include "wayland-private.h"
44 #include "wayland-server-core.h"
45 #include "wayland-os.h"
46
47 /** \cond INTERNAL */
48
49 #define TIMER_REMOVED -2
50
51 struct wl_event_loop;
52 struct wl_event_source_interface;
53 struct wl_event_source_timer;
54
55 struct wl_event_source {
56 struct wl_event_source_interface *interface;
57 struct wl_event_loop *loop;
58 struct wl_list link;
59 void *data;
60 int fd;
61 };
62
63 struct wl_timer_heap {
64 struct wl_event_source base;
65 /* pointers to the user-visible event sources */
66 struct wl_event_source_timer **data;
67 int space, active, count;
68 };
69
70 struct wl_event_loop {
71 int epoll_fd;
72 struct wl_list check_list;
73 struct wl_list idle_list;
74 struct wl_list destroy_list;
75
76 struct wl_signal destroy_signal;
77
78 struct wl_timer_heap timers;
79 };
80
81 struct wl_event_source_interface {
82 int (*dispatch)(struct wl_event_source *source,
83 struct epoll_event *ep);
84 };
85
86
87 struct wl_event_source_fd {
88 struct wl_event_source base;
89 wl_event_loop_fd_func_t func;
90 int fd;
91 };
92
93 /** \endcond */
94
95 static int
wl_event_source_fd_dispatch(struct wl_event_source * source,struct epoll_event * ep)96 wl_event_source_fd_dispatch(struct wl_event_source *source,
97 struct epoll_event *ep)
98 {
99 struct wl_event_source_fd *fd_source = (struct wl_event_source_fd *) source;
100 uint32_t mask;
101
102 mask = 0;
103 if (ep->events & EPOLLIN)
104 mask |= WL_EVENT_READABLE;
105 if (ep->events & EPOLLOUT)
106 mask |= WL_EVENT_WRITABLE;
107 if (ep->events & EPOLLHUP)
108 mask |= WL_EVENT_HANGUP;
109 if (ep->events & EPOLLERR)
110 mask |= WL_EVENT_ERROR;
111
112 return fd_source->func(fd_source->fd, mask, source->data);
113 }
114
115 struct wl_event_source_interface fd_source_interface = {
116 wl_event_source_fd_dispatch,
117 };
118
119 static struct wl_event_source *
add_source(struct wl_event_loop * loop,struct wl_event_source * source,uint32_t mask,void * data)120 add_source(struct wl_event_loop *loop,
121 struct wl_event_source *source, uint32_t mask, void *data)
122 {
123 struct epoll_event ep;
124
125 if (source->fd < 0) {
126 free(source);
127 return NULL;
128 }
129
130 source->loop = loop;
131 source->data = data;
132 wl_list_init(&source->link);
133
134 memset(&ep, 0, sizeof ep);
135 if (mask & WL_EVENT_READABLE)
136 ep.events |= EPOLLIN;
137 if (mask & WL_EVENT_WRITABLE)
138 ep.events |= EPOLLOUT;
139 ep.data.ptr = source;
140
141 if (epoll_ctl(loop->epoll_fd, EPOLL_CTL_ADD, source->fd, &ep) < 0) {
142 close(source->fd);
143 free(source);
144 return NULL;
145 }
146
147 return source;
148 }
149
150 /** Create a file descriptor event source
151 *
152 * \param loop The event loop that will process the new source.
153 * \param fd The file descriptor to watch.
154 * \param mask A bitwise-or of which events to watch for: \c WL_EVENT_READABLE,
155 * \c WL_EVENT_WRITABLE.
156 * \param func The file descriptor dispatch function.
157 * \param data User data.
158 * \return A new file descriptor event source.
159 *
160 * The given file descriptor is initially watched for the events given in
161 * \c mask. This can be changed as needed with wl_event_source_fd_update().
162 *
163 * If it is possible that program execution causes the file descriptor to be
164 * read while leaving the data in a buffer without actually processing it,
165 * it may be necessary to register the file descriptor source to be re-checked,
166 * see wl_event_source_check(). This will ensure that the dispatch function
167 * gets called even if the file descriptor is not readable or writable
168 * anymore. This is especially useful with IPC libraries that automatically
169 * buffer incoming data, possibly as a side-effect of other operations.
170 *
171 * \sa wl_event_loop_fd_func_t
172 * \memberof wl_event_source
173 */
174 WL_EXPORT struct wl_event_source *
wl_event_loop_add_fd(struct wl_event_loop * loop,int fd,uint32_t mask,wl_event_loop_fd_func_t func,void * data)175 wl_event_loop_add_fd(struct wl_event_loop *loop,
176 int fd, uint32_t mask,
177 wl_event_loop_fd_func_t func,
178 void *data)
179 {
180 struct wl_event_source_fd *source;
181
182 source = malloc(sizeof *source);
183 if (source == NULL)
184 return NULL;
185
186 source->base.interface = &fd_source_interface;
187 source->base.fd = wl_os_dupfd_cloexec(fd, 0);
188 source->func = func;
189 source->fd = fd;
190
191 return add_source(loop, &source->base, mask, data);
192 }
193
194 /** Update a file descriptor source's event mask
195 *
196 * \param source The file descriptor event source to update.
197 * \param mask The new mask, a bitwise-or of: \c WL_EVENT_READABLE,
198 * \c WL_EVENT_WRITABLE.
199 * \return 0 on success, -1 on failure.
200 *
201 * This changes which events, readable and/or writable, cause the dispatch
202 * callback to be called on.
203 *
204 * File descriptors are usually writable to begin with, so they do not need to
205 * be polled for writable until a write actually fails. When a write fails,
206 * the event mask can be changed to poll for readable and writable, delivering
207 * a dispatch callback when it is possible to write more. Once all data has
208 * been written, the mask can be changed to poll only for readable to avoid
209 * busy-looping on dispatch.
210 *
211 * \sa wl_event_loop_add_fd()
212 * \memberof wl_event_source
213 */
214 WL_EXPORT int
wl_event_source_fd_update(struct wl_event_source * source,uint32_t mask)215 wl_event_source_fd_update(struct wl_event_source *source, uint32_t mask)
216 {
217 struct wl_event_loop *loop = source->loop;
218 struct epoll_event ep;
219
220 memset(&ep, 0, sizeof ep);
221 if (mask & WL_EVENT_READABLE)
222 ep.events |= EPOLLIN;
223 if (mask & WL_EVENT_WRITABLE)
224 ep.events |= EPOLLOUT;
225 ep.data.ptr = source;
226
227 return epoll_ctl(loop->epoll_fd, EPOLL_CTL_MOD, source->fd, &ep);
228 }
229
230 /** \cond INTERNAL */
231
232 struct wl_event_source_timer {
233 struct wl_event_source base;
234 wl_event_loop_timer_func_t func;
235 struct wl_event_source_timer *next_due;
236 struct timespec deadline;
237 int heap_idx;
238 };
239
240 static int
noop_dispatch(struct wl_event_source * source,struct epoll_event * ep)241 noop_dispatch(struct wl_event_source *source,
242 struct epoll_event *ep) {
243 return 0;
244 }
245
246 struct wl_event_source_interface timer_heap_source_interface = {
247 noop_dispatch,
248 };
249
250 static bool
time_lt(struct timespec ta,struct timespec tb)251 time_lt(struct timespec ta, struct timespec tb)
252 {
253 if (ta.tv_sec != tb.tv_sec) {
254 return ta.tv_sec < tb.tv_sec;
255 }
256 return ta.tv_nsec < tb.tv_nsec;
257 }
258
259 static int
set_timer(int timerfd,struct timespec deadline)260 set_timer(int timerfd, struct timespec deadline) {
261 struct itimerspec its;
262
263 its.it_interval.tv_sec = 0;
264 its.it_interval.tv_nsec = 0;
265 its.it_value = deadline;
266 return timerfd_settime(timerfd, TFD_TIMER_ABSTIME, &its, NULL);
267 }
268
269 static int
clear_timer(int timerfd)270 clear_timer(int timerfd)
271 {
272 struct itimerspec its;
273
274 its.it_interval.tv_sec = 0;
275 its.it_interval.tv_nsec = 0;
276 its.it_value.tv_sec = 0;
277 its.it_value.tv_nsec = 0;
278 return timerfd_settime(timerfd, 0, &its, NULL);
279 }
280
281 static void
wl_timer_heap_init(struct wl_timer_heap * timers,struct wl_event_loop * loop)282 wl_timer_heap_init(struct wl_timer_heap *timers, struct wl_event_loop *loop)
283 {
284 timers->base.fd = -1;
285 timers->base.data = NULL;
286 wl_list_init(&timers->base.link);
287 timers->base.interface = &timer_heap_source_interface;
288 timers->base.loop = loop;
289
290 loop->timers.data = NULL;
291 loop->timers.active = 0;
292 loop->timers.space = 0;
293 loop->timers.count = 0;
294 }
295
296 static void
wl_timer_heap_release(struct wl_timer_heap * timers)297 wl_timer_heap_release(struct wl_timer_heap *timers)
298 {
299 if (timers->base.fd != -1) {
300 close(timers->base.fd);
301 }
302 free(timers->data);
303 }
304
305 static int
wl_timer_heap_ensure_timerfd(struct wl_timer_heap * timers)306 wl_timer_heap_ensure_timerfd(struct wl_timer_heap *timers)
307 {
308 struct epoll_event ep;
309 int timer_fd;
310
311 if (timers->base.fd != -1)
312 return 0;
313
314 memset(&ep, 0, sizeof ep);
315 ep.events = EPOLLIN;
316 ep.data.ptr = timers;
317
318 timer_fd = timerfd_create(CLOCK_MONOTONIC,
319 TFD_CLOEXEC | TFD_NONBLOCK);
320 if (timer_fd < 0)
321 return -1;
322
323 if (epoll_ctl(timers->base.loop->epoll_fd,
324 EPOLL_CTL_ADD, timer_fd, &ep) < 0) {
325 close(timer_fd);
326 return -1;
327 }
328
329 timers->base.fd = timer_fd;
330 return 0;
331 }
332
333 static int
wl_timer_heap_reserve(struct wl_timer_heap * timers)334 wl_timer_heap_reserve(struct wl_timer_heap *timers)
335 {
336 struct wl_event_source_timer **n;
337 int new_space;
338
339 if (timers->count + 1 > timers->space) {
340 new_space = timers->space >= 8 ? timers->space * 2 : 8;
341 n = realloc(timers->data, (size_t)new_space * sizeof(*n));
342 if (!n) {
343 wl_log("Allocation failure when expanding timer list");
344 return -1;
345 }
346 timers->data = n;
347 timers->space = new_space;
348 }
349
350 timers->count++;
351 return 0;
352 }
353
354 static void
wl_timer_heap_unreserve(struct wl_timer_heap * timers)355 wl_timer_heap_unreserve(struct wl_timer_heap *timers)
356 {
357 struct wl_event_source_timer **n;
358
359 timers->count--;
360
361 if (timers->space >= 16 && timers->space >= 4 * timers->count) {
362 n = realloc(timers->data, (size_t)timers->space / 2 * sizeof(*n));
363 if (!n) {
364 wl_log("Reallocation failure when shrinking timer list");
365 return;
366 }
367 timers->data = n;
368 timers->space = timers->space / 2;
369 }
370 }
371
372 static int
heap_set(struct wl_event_source_timer ** data,struct wl_event_source_timer * a,int idx)373 heap_set(struct wl_event_source_timer **data,
374 struct wl_event_source_timer *a,
375 int idx)
376 {
377 int tmp;
378
379 tmp = a->heap_idx;
380 a->heap_idx = idx;
381 data[a->heap_idx] = a;
382
383 return tmp;
384 }
385
386 static void
heap_sift_down(struct wl_event_source_timer ** data,int num_active,struct wl_event_source_timer * source)387 heap_sift_down(struct wl_event_source_timer **data,
388 int num_active,
389 struct wl_event_source_timer *source)
390 {
391 struct wl_event_source_timer *child, *other_child;
392 int cursor_idx;
393 struct timespec key;
394
395 cursor_idx = source->heap_idx;
396 key = source->deadline;
397 while (1) {
398 int lchild_idx = cursor_idx * 2 + 1;
399
400 if (lchild_idx >= num_active) {
401 break;
402 }
403
404 child = data[lchild_idx];
405 if (lchild_idx + 1 < num_active) {
406 other_child = data[lchild_idx + 1];
407 if (time_lt(other_child->deadline, child->deadline))
408 child = other_child;
409 }
410
411 if (time_lt(child->deadline, key))
412 cursor_idx = heap_set(data, child, cursor_idx);
413 else
414 break;
415 }
416
417 heap_set(data, source, cursor_idx);
418 }
419
420 static void
heap_sift_up(struct wl_event_source_timer ** data,struct wl_event_source_timer * source)421 heap_sift_up(struct wl_event_source_timer **data,
422 struct wl_event_source_timer *source)
423 {
424 int cursor_idx;
425 struct timespec key;
426
427 cursor_idx = source->heap_idx;
428 key = source->deadline;
429 while (cursor_idx > 0) {
430 struct wl_event_source_timer *parent =
431 data[(cursor_idx - 1) / 2];
432
433 if (time_lt(key, parent->deadline))
434 cursor_idx = heap_set(data, parent, cursor_idx);
435 else
436 break;
437 }
438 heap_set(data, source, cursor_idx);
439 }
440
441 /* requires timer be armed */
442 static void
wl_timer_heap_disarm(struct wl_timer_heap * timers,struct wl_event_source_timer * source)443 wl_timer_heap_disarm(struct wl_timer_heap *timers,
444 struct wl_event_source_timer *source)
445 {
446 struct wl_event_source_timer *last_end_evt;
447 int old_source_idx;
448
449 assert(source->heap_idx >= 0);
450
451 old_source_idx = source->heap_idx;
452 source->heap_idx = -1;
453 source->deadline.tv_sec = 0;
454 source->deadline.tv_nsec = 0;
455
456 last_end_evt = timers->data[timers->active - 1];
457 timers->data[timers->active - 1] = NULL;
458 timers->active--;
459
460 if (old_source_idx == timers->active)
461 return;
462
463 timers->data[old_source_idx] = last_end_evt;
464 last_end_evt->heap_idx = old_source_idx;
465
466 /* Move the displaced (active) element to its proper place.
467 * Only one of sift-down and sift-up will have any effect */
468 heap_sift_down(timers->data, timers->active, last_end_evt);
469 heap_sift_up(timers->data, last_end_evt);
470 }
471
472 /* requires timer be disarmed */
473 static void
wl_timer_heap_arm(struct wl_timer_heap * timers,struct wl_event_source_timer * source,struct timespec deadline)474 wl_timer_heap_arm(struct wl_timer_heap *timers,
475 struct wl_event_source_timer *source,
476 struct timespec deadline)
477 {
478 assert(source->heap_idx == -1);
479
480 source->deadline = deadline;
481 timers->data[timers->active] = source;
482 source->heap_idx = timers->active;
483 timers->active++;
484 heap_sift_up(timers->data, source);
485 }
486
487
488 static int
wl_timer_heap_dispatch(struct wl_timer_heap * timers)489 wl_timer_heap_dispatch(struct wl_timer_heap *timers)
490 {
491 struct timespec now;
492 struct wl_event_source_timer *root;
493 struct wl_event_source_timer *list_cursor = NULL, *list_tail = NULL;
494
495 clock_gettime(CLOCK_MONOTONIC, &now);
496
497 while (timers->active > 0) {
498 root = timers->data[0];
499 if (time_lt(now, root->deadline))
500 break;
501
502 wl_timer_heap_disarm(timers, root);
503
504 if (list_cursor == NULL)
505 list_cursor = root;
506 else
507 list_tail->next_due = root;
508 list_tail = root;
509 }
510 if (list_tail)
511 list_tail->next_due = NULL;
512
513 if (timers->active > 0) {
514 if (set_timer(timers->base.fd, timers->data[0]->deadline) < 0)
515 return -1;
516 } else {
517 if (clear_timer(timers->base.fd) < 0)
518 return -1;
519 }
520
521 /* Execute precisely the functions for events before `now`, in order.
522 * Because wl_event_loop_dispatch ignores return codes, do the same
523 * here as well */
524 for (; list_cursor; list_cursor = list_cursor->next_due) {
525 if (list_cursor->base.fd != TIMER_REMOVED)
526 list_cursor->func(list_cursor->base.data);
527 }
528
529 return 0;
530 }
531
532 static int
wl_event_source_timer_dispatch(struct wl_event_source * source,struct epoll_event * ep)533 wl_event_source_timer_dispatch(struct wl_event_source *source,
534 struct epoll_event *ep)
535 {
536 struct wl_event_source_timer *timer;
537
538 timer = wl_container_of(source, timer, base);
539 return timer->func(timer->base.data);
540 }
541
542 struct wl_event_source_interface timer_source_interface = {
543 wl_event_source_timer_dispatch,
544 };
545
546 /** \endcond */
547
548 /** Create a timer event source
549 *
550 * \param loop The event loop that will process the new source.
551 * \param func The timer dispatch function.
552 * \param data User data.
553 * \return A new timer event source.
554 *
555 * The timer is initially disarmed. It needs to be armed with a call to
556 * wl_event_source_timer_update() before it can trigger a dispatch call.
557 *
558 * \sa wl_event_loop_timer_func_t
559 * \memberof wl_event_source
560 */
561 WL_EXPORT struct wl_event_source *
wl_event_loop_add_timer(struct wl_event_loop * loop,wl_event_loop_timer_func_t func,void * data)562 wl_event_loop_add_timer(struct wl_event_loop *loop,
563 wl_event_loop_timer_func_t func,
564 void *data)
565 {
566 struct wl_event_source_timer *source;
567
568 if (wl_timer_heap_ensure_timerfd(&loop->timers) < 0)
569 return NULL;
570
571 source = malloc(sizeof *source);
572 if (source == NULL)
573 return NULL;
574
575 source->base.interface = &timer_source_interface;
576 source->base.fd = -1;
577 source->func = func;
578 source->base.loop = loop;
579 source->base.data = data;
580 wl_list_init(&source->base.link);
581 source->next_due = NULL;
582 source->deadline.tv_sec = 0;
583 source->deadline.tv_nsec = 0;
584 source->heap_idx = -1;
585
586 if (wl_timer_heap_reserve(&loop->timers) < 0) {
587 free(source);
588 return NULL;
589 }
590
591 return &source->base;
592 }
593
594 /** Arm or disarm a timer
595 *
596 * \param source The timer event source to modify.
597 * \param ms_delay The timeout in milliseconds.
598 * \return 0 on success, -1 on failure.
599 *
600 * If the timeout is zero, the timer is disarmed.
601 *
602 * If the timeout is non-zero, the timer is set to expire after the given
603 * timeout in milliseconds. When the timer expires, the dispatch function
604 * set with wl_event_loop_add_timer() is called once from
605 * wl_event_loop_dispatch(). If another dispatch is desired after another
606 * expiry, wl_event_source_timer_update() needs to be called again.
607 *
608 * \memberof wl_event_source
609 */
610 WL_EXPORT int
wl_event_source_timer_update(struct wl_event_source * source,int ms_delay)611 wl_event_source_timer_update(struct wl_event_source *source, int ms_delay)
612 {
613 struct wl_event_source_timer *tsource =
614 wl_container_of(source, tsource, base);
615 struct wl_timer_heap *timers = &tsource->base.loop->timers;
616
617 if (ms_delay > 0) {
618 struct timespec deadline;
619
620 clock_gettime(CLOCK_MONOTONIC, &deadline);
621
622 deadline.tv_nsec += (ms_delay % 1000) * 1000000L;
623 deadline.tv_sec += ms_delay / 1000;
624 if (deadline.tv_nsec >= 1000000000L) {
625 deadline.tv_nsec -= 1000000000L;
626 deadline.tv_sec += 1;
627 }
628
629 if (tsource->heap_idx == -1) {
630 wl_timer_heap_arm(timers, tsource, deadline);
631 } else if (time_lt(deadline, tsource->deadline)) {
632 tsource->deadline = deadline;
633 heap_sift_up(timers->data, tsource);
634 } else {
635 tsource->deadline = deadline;
636 heap_sift_down(timers->data, timers->active, tsource);
637 }
638
639 if (tsource->heap_idx == 0) {
640 /* Only update the timerfd if the new deadline is
641 * the earliest */
642 if (set_timer(timers->base.fd, deadline) < 0)
643 return -1;
644 }
645 } else {
646 if (tsource->heap_idx == -1)
647 return 0;
648 wl_timer_heap_disarm(timers, tsource);
649
650 if (timers->active == 0) {
651 /* Only update the timerfd if this was the last
652 * active timer */
653 if (clear_timer(timers->base.fd) < 0)
654 return -1;
655 }
656 }
657
658 return 0;
659 }
660
661 /** \cond INTERNAL */
662
663 struct wl_event_source_signal {
664 struct wl_event_source base;
665 int signal_number;
666 wl_event_loop_signal_func_t func;
667 };
668
669 /** \endcond */
670
671 static int
wl_event_source_signal_dispatch(struct wl_event_source * source,struct epoll_event * ep)672 wl_event_source_signal_dispatch(struct wl_event_source *source,
673 struct epoll_event *ep)
674 {
675 struct wl_event_source_signal *signal_source =
676 (struct wl_event_source_signal *) source;
677 struct signalfd_siginfo signal_info;
678 int len;
679
680 len = read(source->fd, &signal_info, sizeof signal_info);
681 if (!(len == -1 && errno == EAGAIN) && len != sizeof signal_info)
682 /* Is there anything we can do here? Will this ever happen? */
683 wl_log("signalfd read error: %s\n", strerror(errno));
684
685 return signal_source->func(signal_source->signal_number,
686 signal_source->base.data);
687 }
688
689 struct wl_event_source_interface signal_source_interface = {
690 wl_event_source_signal_dispatch,
691 };
692
693 /** Create a POSIX signal event source
694 *
695 * \param loop The event loop that will process the new source.
696 * \param signal_number Number of the signal to watch for.
697 * \param func The signal dispatch function.
698 * \param data User data.
699 * \return A new signal event source.
700 *
701 * This function blocks the normal delivery of the given signal in the calling
702 * thread, and creates a "watch" for it. Signal delivery no longer happens
703 * asynchronously, but by wl_event_loop_dispatch() calling the dispatch
704 * callback function \c func.
705 *
706 * It is the caller's responsibility to ensure that all other threads have
707 * also blocked the signal.
708 *
709 * \sa wl_event_loop_signal_func_t
710 * \memberof wl_event_source
711 */
712 WL_EXPORT struct wl_event_source *
wl_event_loop_add_signal(struct wl_event_loop * loop,int signal_number,wl_event_loop_signal_func_t func,void * data)713 wl_event_loop_add_signal(struct wl_event_loop *loop,
714 int signal_number,
715 wl_event_loop_signal_func_t func,
716 void *data)
717 {
718 struct wl_event_source_signal *source;
719 sigset_t mask;
720
721 source = malloc(sizeof *source);
722 if (source == NULL)
723 return NULL;
724
725 source->base.interface = &signal_source_interface;
726 source->signal_number = signal_number;
727
728 sigemptyset(&mask);
729 sigaddset(&mask, signal_number);
730 source->base.fd = signalfd(-1, &mask, SFD_CLOEXEC | SFD_NONBLOCK);
731 sigprocmask(SIG_BLOCK, &mask, NULL);
732
733 source->func = func;
734
735 return add_source(loop, &source->base, WL_EVENT_READABLE, data);
736 }
737
738 /** \cond INTERNAL */
739
740 struct wl_event_source_idle {
741 struct wl_event_source base;
742 wl_event_loop_idle_func_t func;
743 };
744
745 /** \endcond */
746
747 struct wl_event_source_interface idle_source_interface = {
748 NULL,
749 };
750
751 /** Create an idle task
752 *
753 * \param loop The event loop that will process the new task.
754 * \param func The idle task dispatch function.
755 * \param data User data.
756 * \return A new idle task (an event source).
757 *
758 * Idle tasks are dispatched before wl_event_loop_dispatch() goes to sleep.
759 * See wl_event_loop_dispatch() for more details.
760 *
761 * Idle tasks fire once, and are automatically destroyed right after the
762 * callback function has been called.
763 *
764 * An idle task can be cancelled before the callback has been called by
765 * wl_event_source_remove(). Calling wl_event_source_remove() after or from
766 * within the callback results in undefined behaviour.
767 *
768 * \sa wl_event_loop_idle_func_t
769 * \memberof wl_event_source
770 */
771 WL_EXPORT struct wl_event_source *
wl_event_loop_add_idle(struct wl_event_loop * loop,wl_event_loop_idle_func_t func,void * data)772 wl_event_loop_add_idle(struct wl_event_loop *loop,
773 wl_event_loop_idle_func_t func,
774 void *data)
775 {
776 struct wl_event_source_idle *source;
777
778 source = malloc(sizeof *source);
779 if (source == NULL)
780 return NULL;
781
782 source->base.interface = &idle_source_interface;
783 source->base.loop = loop;
784 source->base.fd = -1;
785
786 source->func = func;
787 source->base.data = data;
788
789 wl_list_insert(loop->idle_list.prev, &source->base.link);
790
791 return &source->base;
792 }
793
794 /** Mark event source to be re-checked
795 *
796 * \param source The event source to be re-checked.
797 *
798 * This function permanently marks the event source to be re-checked after
799 * the normal dispatch of sources in wl_event_loop_dispatch(). Re-checking
800 * will keep iterating over all such event sources until the dispatch
801 * function for them all returns zero.
802 *
803 * Re-checking is used on sources that may become ready to dispatch as a
804 * side-effect of dispatching themselves or other event sources, including idle
805 * sources. Re-checking ensures all the incoming events have been fully drained
806 * before wl_event_loop_dispatch() returns.
807 *
808 * \memberof wl_event_source
809 */
810 WL_EXPORT void
wl_event_source_check(struct wl_event_source * source)811 wl_event_source_check(struct wl_event_source *source)
812 {
813 wl_list_insert(source->loop->check_list.prev, &source->link);
814 }
815
816 /** Remove an event source from its event loop
817 *
818 * \param source The event source to be removed.
819 * \return Zero.
820 *
821 * The event source is removed from the event loop it was created for,
822 * and is effectively destroyed. This invalidates \c source .
823 * The dispatch function of the source will no longer be called through this
824 * source.
825 *
826 * \memberof wl_event_source
827 */
828 WL_EXPORT int
wl_event_source_remove(struct wl_event_source * source)829 wl_event_source_remove(struct wl_event_source *source)
830 {
831 struct wl_event_loop *loop = source->loop;
832
833 /* We need to explicitly remove the fd, since closing the fd
834 * isn't enough in case we've dup'ed the fd. */
835 if (source->fd >= 0) {
836 epoll_ctl(loop->epoll_fd, EPOLL_CTL_DEL, source->fd, NULL);
837 close(source->fd);
838 source->fd = -1;
839 }
840
841 if (source->interface == &timer_source_interface &&
842 source->fd != TIMER_REMOVED) {
843 /* Disarm the timer (and the loop's timerfd, if necessary),
844 * before removing its space in the loop timer heap */
845 wl_event_source_timer_update(source, 0);
846 wl_timer_heap_unreserve(&loop->timers);
847 /* Set the fd field to to indicate that the timer should NOT
848 * be dispatched in `wl_event_loop_dispatch` */
849 source->fd = TIMER_REMOVED;
850 }
851
852 wl_list_remove(&source->link);
853 wl_list_insert(&loop->destroy_list, &source->link);
854
855 return 0;
856 }
857
858 static void
wl_event_loop_process_destroy_list(struct wl_event_loop * loop)859 wl_event_loop_process_destroy_list(struct wl_event_loop *loop)
860 {
861 struct wl_event_source *source, *next;
862
863 wl_list_for_each_safe(source, next, &loop->destroy_list, link)
864 free(source);
865
866 wl_list_init(&loop->destroy_list);
867 }
868
869 /** Create a new event loop context
870 *
871 * \return A new event loop context object.
872 *
873 * This creates a new event loop context. Initially this context is empty.
874 * Event sources need to be explicitly added to it.
875 *
876 * Normally the event loop is run by calling wl_event_loop_dispatch() in
877 * a loop until the program terminates. Alternatively, an event loop can be
878 * embedded in another event loop by its file descriptor, see
879 * wl_event_loop_get_fd().
880 *
881 * \memberof wl_event_loop
882 */
883 WL_EXPORT struct wl_event_loop *
wl_event_loop_create(void)884 wl_event_loop_create(void)
885 {
886 struct wl_event_loop *loop;
887
888 loop = malloc(sizeof *loop);
889 if (loop == NULL)
890 return NULL;
891
892 loop->epoll_fd = wl_os_epoll_create_cloexec();
893 if (loop->epoll_fd < 0) {
894 free(loop);
895 return NULL;
896 }
897 wl_list_init(&loop->check_list);
898 wl_list_init(&loop->idle_list);
899 wl_list_init(&loop->destroy_list);
900
901 wl_signal_init(&loop->destroy_signal);
902
903 wl_timer_heap_init(&loop->timers, loop);
904
905 return loop;
906 }
907
908 /** Destroy an event loop context
909 *
910 * \param loop The event loop to be destroyed.
911 *
912 * This emits the event loop destroy signal, closes the event loop file
913 * descriptor, and frees \c loop.
914 *
915 * If the event loop has existing sources, those cannot be safely removed
916 * afterwards. Therefore one must call wl_event_source_remove() on all
917 * event sources before destroying the event loop context.
918 *
919 * \memberof wl_event_loop
920 */
921 WL_EXPORT void
wl_event_loop_destroy(struct wl_event_loop * loop)922 wl_event_loop_destroy(struct wl_event_loop *loop)
923 {
924 wl_signal_emit(&loop->destroy_signal, loop);
925
926 wl_event_loop_process_destroy_list(loop);
927 wl_timer_heap_release(&loop->timers);
928 close(loop->epoll_fd);
929 free(loop);
930 }
931
932 static bool
post_dispatch_check(struct wl_event_loop * loop)933 post_dispatch_check(struct wl_event_loop *loop)
934 {
935 struct epoll_event ep;
936 struct wl_event_source *source, *next;
937 bool needs_recheck = false;
938
939 ep.events = 0;
940 wl_list_for_each_safe(source, next, &loop->check_list, link) {
941 int dispatch_result;
942
943 dispatch_result = source->interface->dispatch(source, &ep);
944 if (dispatch_result < 0) {
945 wl_log("Source dispatch function returned negative value!");
946 wl_log("This would previously accidentally suppress a follow-up dispatch");
947 }
948 needs_recheck |= dispatch_result != 0;
949 }
950
951 return needs_recheck;
952 }
953
954 /** Dispatch the idle sources
955 *
956 * \param loop The event loop whose idle sources are dispatched.
957 *
958 * \sa wl_event_loop_add_idle()
959 * \memberof wl_event_loop
960 */
961 WL_EXPORT void
wl_event_loop_dispatch_idle(struct wl_event_loop * loop)962 wl_event_loop_dispatch_idle(struct wl_event_loop *loop)
963 {
964 struct wl_event_source_idle *source;
965
966 while (!wl_list_empty(&loop->idle_list)) {
967 source = wl_container_of(loop->idle_list.next,
968 source, base.link);
969 source->func(source->base.data);
970 wl_event_source_remove(&source->base);
971 }
972 }
973
974 /** Wait for events and dispatch them
975 *
976 * \param loop The event loop whose sources to wait for.
977 * \param timeout The polling timeout in milliseconds.
978 * \return 0 for success, -1 for polling (or timer update) error.
979 *
980 * All the associated event sources are polled. This function blocks until
981 * any event source delivers an event (idle sources excluded), or the timeout
982 * expires. A timeout of -1 disables the timeout, causing the function to block
983 * indefinitely. A timeout of zero causes the poll to always return immediately.
984 *
985 * All idle sources are dispatched before blocking. An idle source is destroyed
986 * when it is dispatched. After blocking, all other ready sources are
987 * dispatched. Then, idle sources are dispatched again, in case the dispatched
988 * events created idle sources. Finally, all sources marked with
989 * wl_event_source_check() are dispatched in a loop until their dispatch
990 * functions all return zero.
991 *
992 * \memberof wl_event_loop
993 */
994 WL_EXPORT int
wl_event_loop_dispatch(struct wl_event_loop * loop,int timeout)995 wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout)
996 {
997 struct epoll_event ep[32];
998 struct wl_event_source *source;
999 int i, count;
1000 bool has_timers = false;
1001
1002 wl_event_loop_dispatch_idle(loop);
1003
1004 count = epoll_wait(loop->epoll_fd, ep, ARRAY_LENGTH(ep), timeout);
1005 if (count < 0)
1006 return -1;
1007
1008 for (i = 0; i < count; i++) {
1009 source = ep[i].data.ptr;
1010 if (source == &loop->timers.base)
1011 has_timers = true;
1012 }
1013
1014 if (has_timers) {
1015 /* Dispatch timer sources before non-timer sources, so that
1016 * the non-timer sources can not cancel (by calling
1017 * `wl_event_source_timer_update`) the dispatching of the timers
1018 * (Note that timer sources also can't cancel pending non-timer
1019 * sources, since epoll_wait has already been called) */
1020 if (wl_timer_heap_dispatch(&loop->timers) < 0)
1021 return -1;
1022 }
1023
1024 for (i = 0; i < count; i++) {
1025 source = ep[i].data.ptr;
1026 if (source->fd != -1)
1027 source->interface->dispatch(source, &ep[i]);
1028 }
1029
1030 wl_event_loop_process_destroy_list(loop);
1031
1032 wl_event_loop_dispatch_idle(loop);
1033
1034 while (post_dispatch_check(loop));
1035
1036 return 0;
1037 }
1038
1039 /** Get the event loop file descriptor
1040 *
1041 * \param loop The event loop context.
1042 * \return The aggregate file descriptor.
1043 *
1044 * This function returns the aggregate file descriptor, that represents all
1045 * the event sources (idle sources excluded) associated with the given event
1046 * loop context. When any event source makes an event available, it will be
1047 * reflected in the aggregate file descriptor.
1048 *
1049 * When the aggregate file descriptor delivers an event, one can call
1050 * wl_event_loop_dispatch() on the event loop context to dispatch all the
1051 * available events.
1052 *
1053 * \memberof wl_event_loop
1054 */
1055 WL_EXPORT int
wl_event_loop_get_fd(struct wl_event_loop * loop)1056 wl_event_loop_get_fd(struct wl_event_loop *loop)
1057 {
1058 return loop->epoll_fd;
1059 }
1060
1061 /** Register a destroy listener for an event loop context
1062 *
1063 * \param loop The event loop context whose destruction to listen for.
1064 * \param listener The listener with the callback to be called.
1065 *
1066 * \sa wl_listener
1067 * \memberof wl_event_loop
1068 */
1069 WL_EXPORT void
wl_event_loop_add_destroy_listener(struct wl_event_loop * loop,struct wl_listener * listener)1070 wl_event_loop_add_destroy_listener(struct wl_event_loop *loop,
1071 struct wl_listener *listener)
1072 {
1073 wl_signal_add(&loop->destroy_signal, listener);
1074 }
1075
1076 /** Get the listener struct for the specified callback
1077 *
1078 * \param loop The event loop context to inspect.
1079 * \param notify The destroy callback to find.
1080 * \return The wl_listener registered to the event loop context with
1081 * the given callback pointer.
1082 *
1083 * \memberof wl_event_loop
1084 */
1085 WL_EXPORT struct wl_listener *
wl_event_loop_get_destroy_listener(struct wl_event_loop * loop,wl_notify_func_t notify)1086 wl_event_loop_get_destroy_listener(struct wl_event_loop *loop,
1087 wl_notify_func_t notify)
1088 {
1089 return wl_signal_get(&loop->destroy_signal, notify);
1090 }
1091