2
This file is part of PulseAudio.
4
Copyright 2004-2006 Lennart Poettering
5
Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
7
PulseAudio is free software; you can redistribute it and/or modify
8
it under the terms of the GNU Lesser General Public License as published
9
by the Free Software Foundation; either version 2.1 of the License,
10
or (at your option) any later version.
12
PulseAudio is distributed in the hope that it will be useful, but
13
WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
General Public License for more details.
17
You should have received a copy of the GNU Lesser General Public License
18
along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
32
#include <pulsecore/pipe.h>
35
#include <pulse/rtclock.h>
36
#include <pulse/timeval.h>
37
#include <pulse/xmalloc.h>
39
#include <pulsecore/poll.h>
40
#include <pulsecore/core-rtclock.h>
41
#include <pulsecore/core-util.h>
42
#include <pulsecore/i18n.h>
43
#include <pulsecore/llist.h>
44
#include <pulsecore/log.h>
45
#include <pulsecore/core-error.h>
46
#include <pulsecore/socket.h>
47
#include <pulsecore/macro.h>
53
pa_mainloop *mainloop;
57
pa_io_event_flags_t events;
58
struct pollfd *pollfd;
60
pa_io_event_cb_t callback;
62
pa_io_event_destroy_cb_t destroy_callback;
64
PA_LLIST_FIELDS(pa_io_event);
67
struct pa_time_event {
68
pa_mainloop *mainloop;
75
pa_time_event_cb_t callback;
77
pa_time_event_destroy_cb_t destroy_callback;
79
PA_LLIST_FIELDS(pa_time_event);
82
struct pa_defer_event {
83
pa_mainloop *mainloop;
88
pa_defer_event_cb_t callback;
90
pa_defer_event_destroy_cb_t destroy_callback;
92
PA_LLIST_FIELDS(pa_defer_event);
96
PA_LLIST_HEAD(pa_io_event, io_events);
97
PA_LLIST_HEAD(pa_time_event, time_events);
98
PA_LLIST_HEAD(pa_defer_event, defer_events);
100
unsigned n_enabled_defer_events, n_enabled_time_events, n_io_events;
101
unsigned io_events_please_scan, time_events_please_scan, defer_events_please_scan;
103
bool rebuild_pollfds:1;
104
struct pollfd *pollfds;
105
unsigned max_pollfds, n_pollfds;
107
pa_usec_t prepared_timeout;
108
pa_time_event *cached_next_time_event;
116
int wakeup_pipe_type;
126
pa_poll_func poll_func;
127
void *poll_func_userdata;
131
static short map_flags_to_libc(pa_io_event_flags_t flags) {
133
((flags & PA_IO_EVENT_INPUT ? POLLIN : 0) |
134
(flags & PA_IO_EVENT_OUTPUT ? POLLOUT : 0) |
135
(flags & PA_IO_EVENT_ERROR ? POLLERR : 0) |
136
(flags & PA_IO_EVENT_HANGUP ? POLLHUP : 0));
139
static pa_io_event_flags_t map_flags_from_libc(short flags) {
141
(flags & POLLIN ? PA_IO_EVENT_INPUT : 0) |
142
(flags & POLLOUT ? PA_IO_EVENT_OUTPUT : 0) |
143
(flags & POLLERR ? PA_IO_EVENT_ERROR : 0) |
144
(flags & POLLHUP ? PA_IO_EVENT_HANGUP : 0);
148
static pa_io_event* mainloop_io_new(
151
pa_io_event_flags_t events,
152
pa_io_event_cb_t callback,
159
pa_assert(a->userdata);
164
pa_assert(a == &m->api);
166
e = pa_xnew0(pa_io_event, 1);
172
e->callback = callback;
173
e->userdata = userdata;
175
PA_LLIST_PREPEND(pa_io_event, m->io_events, e);
176
m->rebuild_pollfds = true;
179
pa_mainloop_wakeup(m);
184
static void mainloop_io_enable(pa_io_event *e, pa_io_event_flags_t events) {
188
if (e->events == events)
194
e->pollfd->events = map_flags_to_libc(events);
196
e->mainloop->rebuild_pollfds = true;
198
pa_mainloop_wakeup(e->mainloop);
201
static void mainloop_io_free(pa_io_event *e) {
206
e->mainloop->io_events_please_scan ++;
208
e->mainloop->n_io_events --;
209
e->mainloop->rebuild_pollfds = true;
211
pa_mainloop_wakeup(e->mainloop);
214
static void mainloop_io_set_destroy(pa_io_event *e, pa_io_event_destroy_cb_t callback) {
217
e->destroy_callback = callback;
221
static pa_defer_event* mainloop_defer_new(
223
pa_defer_event_cb_t callback,
230
pa_assert(a->userdata);
234
pa_assert(a == &m->api);
236
e = pa_xnew0(pa_defer_event, 1);
240
m->n_enabled_defer_events++;
242
e->callback = callback;
243
e->userdata = userdata;
245
PA_LLIST_PREPEND(pa_defer_event, m->defer_events, e);
247
pa_mainloop_wakeup(e->mainloop);
252
static void mainloop_defer_enable(pa_defer_event *e, int b) {
256
if (e->enabled && !b) {
257
pa_assert(e->mainloop->n_enabled_defer_events > 0);
258
e->mainloop->n_enabled_defer_events--;
259
} else if (!e->enabled && b) {
260
e->mainloop->n_enabled_defer_events++;
261
pa_mainloop_wakeup(e->mainloop);
267
static void mainloop_defer_free(pa_defer_event *e) {
272
e->mainloop->defer_events_please_scan ++;
275
pa_assert(e->mainloop->n_enabled_defer_events > 0);
276
e->mainloop->n_enabled_defer_events--;
281
static void mainloop_defer_set_destroy(pa_defer_event *e, pa_defer_event_destroy_cb_t callback) {
285
e->destroy_callback = callback;
289
static pa_usec_t make_rt(const struct timeval *tv, bool *use_rtclock) {
293
*use_rtclock = false;
294
return PA_USEC_INVALID;
298
*use_rtclock = !!(ttv.tv_usec & PA_TIMEVAL_RTCLOCK);
301
ttv.tv_usec &= ~PA_TIMEVAL_RTCLOCK;
303
pa_rtclock_from_wallclock(&ttv);
305
return pa_timeval_load(&ttv);
308
static pa_time_event* mainloop_time_new(
310
const struct timeval *tv,
311
pa_time_event_cb_t callback,
317
bool use_rtclock = false;
320
pa_assert(a->userdata);
323
t = make_rt(tv, &use_rtclock);
326
pa_assert(a == &m->api);
328
e = pa_xnew0(pa_time_event, 1);
331
if ((e->enabled = (t != PA_USEC_INVALID))) {
333
e->use_rtclock = use_rtclock;
335
m->n_enabled_time_events++;
337
if (m->cached_next_time_event) {
338
pa_assert(m->cached_next_time_event->enabled);
340
if (t < m->cached_next_time_event->time)
341
m->cached_next_time_event = e;
345
e->callback = callback;
346
e->userdata = userdata;
348
PA_LLIST_PREPEND(pa_time_event, m->time_events, e);
351
pa_mainloop_wakeup(m);
356
static void mainloop_time_restart(pa_time_event *e, const struct timeval *tv) {
359
bool use_rtclock = false;
364
t = make_rt(tv, &use_rtclock);
366
valid = (t != PA_USEC_INVALID);
367
if (e->enabled && !valid) {
368
pa_assert(e->mainloop->n_enabled_time_events > 0);
369
e->mainloop->n_enabled_time_events--;
370
} else if (!e->enabled && valid)
371
e->mainloop->n_enabled_time_events++;
373
if ((e->enabled = valid)) {
375
e->use_rtclock = use_rtclock;
376
pa_mainloop_wakeup(e->mainloop);
379
if (e->mainloop->cached_next_time_event == e)
380
e->mainloop->cached_next_time_event = NULL;
382
if (e->mainloop->cached_next_time_event && e->enabled) {
383
pa_assert(e->mainloop->cached_next_time_event->enabled);
385
if (t < e->mainloop->cached_next_time_event->time)
386
e->mainloop->cached_next_time_event = e;
390
static void mainloop_time_free(pa_time_event *e) {
395
e->mainloop->time_events_please_scan ++;
398
pa_assert(e->mainloop->n_enabled_time_events > 0);
399
e->mainloop->n_enabled_time_events--;
403
if (e->mainloop->cached_next_time_event == e)
404
e->mainloop->cached_next_time_event = NULL;
406
/* no wakeup needed here. Think about it! */
409
static void mainloop_time_set_destroy(pa_time_event *e, pa_time_event_destroy_cb_t callback) {
413
e->destroy_callback = callback;
418
static void mainloop_quit(pa_mainloop_api *a, int retval) {
422
pa_assert(a->userdata);
424
pa_assert(a == &m->api);
426
pa_mainloop_quit(m, retval);
429
static const pa_mainloop_api vtable = {
432
.io_new = mainloop_io_new,
433
.io_enable = mainloop_io_enable,
434
.io_free = mainloop_io_free,
435
.io_set_destroy = mainloop_io_set_destroy,
437
.time_new = mainloop_time_new,
438
.time_restart = mainloop_time_restart,
439
.time_free = mainloop_time_free,
440
.time_set_destroy = mainloop_time_set_destroy,
442
.defer_new = mainloop_defer_new,
443
.defer_enable = mainloop_defer_enable,
444
.defer_free = mainloop_defer_free,
445
.defer_set_destroy = mainloop_defer_set_destroy,
447
.quit = mainloop_quit,
450
pa_mainloop *pa_mainloop_new(void) {
455
m = pa_xnew0(pa_mainloop, 1);
457
if (pa_pipe_cloexec(m->wakeup_pipe) < 0) {
458
pa_log_error("ERROR: cannot create wakeup pipe");
463
pa_make_fd_nonblock(m->wakeup_pipe[0]);
464
pa_make_fd_nonblock(m->wakeup_pipe[1]);
466
m->rebuild_pollfds = true;
471
m->state = STATE_PASSIVE;
473
m->poll_func_ret = -1;
478
static void cleanup_io_events(pa_mainloop *m, bool force) {
481
PA_LLIST_FOREACH_SAFE(e, n, m->io_events) {
483
if (!force && m->io_events_please_scan <= 0)
486
if (force || e->dead) {
487
PA_LLIST_REMOVE(pa_io_event, m->io_events, e);
490
pa_assert(m->io_events_please_scan > 0);
491
m->io_events_please_scan--;
494
if (e->destroy_callback)
495
e->destroy_callback(&m->api, e, e->userdata);
499
m->rebuild_pollfds = true;
503
pa_assert(m->io_events_please_scan == 0);
506
static void cleanup_time_events(pa_mainloop *m, bool force) {
507
pa_time_event *e, *n;
509
PA_LLIST_FOREACH_SAFE(e, n, m->time_events) {
511
if (!force && m->time_events_please_scan <= 0)
514
if (force || e->dead) {
515
PA_LLIST_REMOVE(pa_time_event, m->time_events, e);
518
pa_assert(m->time_events_please_scan > 0);
519
m->time_events_please_scan--;
522
if (!e->dead && e->enabled) {
523
pa_assert(m->n_enabled_time_events > 0);
524
m->n_enabled_time_events--;
528
if (e->destroy_callback)
529
e->destroy_callback(&m->api, e, e->userdata);
535
pa_assert(m->time_events_please_scan == 0);
538
static void cleanup_defer_events(pa_mainloop *m, bool force) {
539
pa_defer_event *e, *n;
541
PA_LLIST_FOREACH_SAFE(e, n, m->defer_events) {
543
if (!force && m->defer_events_please_scan <= 0)
546
if (force || e->dead) {
547
PA_LLIST_REMOVE(pa_defer_event, m->defer_events, e);
550
pa_assert(m->defer_events_please_scan > 0);
551
m->defer_events_please_scan--;
554
if (!e->dead && e->enabled) {
555
pa_assert(m->n_enabled_defer_events > 0);
556
m->n_enabled_defer_events--;
560
if (e->destroy_callback)
561
e->destroy_callback(&m->api, e, e->userdata);
567
pa_assert(m->defer_events_please_scan == 0);
570
void pa_mainloop_free(pa_mainloop *m) {
573
cleanup_io_events(m, true);
574
cleanup_defer_events(m, true);
575
cleanup_time_events(m, true);
577
pa_xfree(m->pollfds);
579
pa_close_pipe(m->wakeup_pipe);
584
static void scan_dead(pa_mainloop *m) {
587
if (m->io_events_please_scan)
588
cleanup_io_events(m, false);
590
if (m->time_events_please_scan)
591
cleanup_time_events(m, false);
593
if (m->defer_events_please_scan)
594
cleanup_defer_events(m, false);
597
static void rebuild_pollfds(pa_mainloop *m) {
602
l = m->n_io_events + 1;
603
if (m->max_pollfds < l) {
605
m->pollfds = pa_xrealloc(m->pollfds, sizeof(struct pollfd)*l);
612
m->pollfds[0].fd = m->wakeup_pipe[0];
613
m->pollfds[0].events = POLLIN;
614
m->pollfds[0].revents = 0;
618
PA_LLIST_FOREACH(e, m->io_events) {
626
p->events = map_flags_to_libc(e->events);
633
m->rebuild_pollfds = false;
636
static unsigned dispatch_pollfds(pa_mainloop *m) {
640
pa_assert(m->poll_func_ret > 0);
642
k = m->poll_func_ret;
644
PA_LLIST_FOREACH(e, m->io_events) {
646
if (k <= 0 || m->quit)
649
if (e->dead || !e->pollfd || !e->pollfd->revents)
652
pa_assert(e->pollfd->fd == e->fd);
653
pa_assert(e->callback);
655
e->callback(&m->api, e, e->fd, map_flags_from_libc(e->pollfd->revents), e->userdata);
656
e->pollfd->revents = 0;
664
static unsigned dispatch_defer(pa_mainloop *m) {
668
if (m->n_enabled_defer_events <= 0)
671
PA_LLIST_FOREACH(e, m->defer_events) {
676
if (e->dead || !e->enabled)
679
pa_assert(e->callback);
680
e->callback(&m->api, e, e->userdata);
687
static pa_time_event* find_next_time_event(pa_mainloop *m) {
688
pa_time_event *t, *n = NULL;
691
if (m->cached_next_time_event)
692
return m->cached_next_time_event;
694
PA_LLIST_FOREACH(t, m->time_events) {
696
if (t->dead || !t->enabled)
699
if (!n || t->time < n->time) {
702
/* Shortcut for time == 0 */
708
m->cached_next_time_event = n;
712
static pa_usec_t calc_next_timeout(pa_mainloop *m) {
716
if (m->n_enabled_time_events <= 0)
717
return PA_USEC_INVALID;
719
pa_assert_se(t = find_next_time_event(m));
724
clock_now = pa_rtclock_now();
726
if (t->time <= clock_now)
729
return t->time - clock_now;
732
static unsigned dispatch_timeout(pa_mainloop *m) {
738
if (m->n_enabled_time_events <= 0)
741
now = pa_rtclock_now();
743
PA_LLIST_FOREACH(e, m->time_events) {
748
if (e->dead || !e->enabled)
751
if (e->time <= now) {
753
pa_assert(e->callback);
755
/* Disable time event */
756
mainloop_time_restart(e, NULL);
758
e->callback(&m->api, e, pa_timeval_rtstore(&tv, e->time, e->use_rtclock), e->userdata);
767
void pa_mainloop_wakeup(pa_mainloop *m) {
771
if (pa_write(m->wakeup_pipe[1], &c, sizeof(c), &m->wakeup_pipe_type) < 0)
772
/* Not many options for recovering from the error. Let's at least log something. */
773
pa_log("pa_write() failed while trying to wake up the mainloop: %s", pa_cstrerror(errno));
776
static void clear_wakeup(pa_mainloop *m) {
781
while (pa_read(m->wakeup_pipe[0], &c, sizeof(c), &m->wakeup_pipe_type) == sizeof(c))
785
int pa_mainloop_prepare(pa_mainloop *m, int timeout) {
787
pa_assert(m->state == STATE_PASSIVE);
795
if (m->n_enabled_defer_events <= 0) {
797
if (m->rebuild_pollfds)
800
m->prepared_timeout = calc_next_timeout(m);
802
uint64_t u = (uint64_t) timeout * PA_USEC_PER_MSEC;
804
if (u < m->prepared_timeout || m->prepared_timeout == PA_USEC_INVALID)
805
m->prepared_timeout = timeout;
809
m->state = STATE_PREPARED;
813
m->state = STATE_QUIT;
817
static int usec_to_timeout(pa_usec_t u) {
820
if (u == PA_USEC_INVALID)
823
timeout = (u + PA_USEC_PER_MSEC - 1) / PA_USEC_PER_MSEC;
824
pa_assert(timeout >= 0);
829
int pa_mainloop_poll(pa_mainloop *m) {
831
pa_assert(m->state == STATE_PREPARED);
836
m->state = STATE_POLLING;
838
if (m->n_enabled_defer_events)
839
m->poll_func_ret = 0;
841
pa_assert(!m->rebuild_pollfds);
844
m->poll_func_ret = m->poll_func(
845
m->pollfds, m->n_pollfds,
846
usec_to_timeout(m->prepared_timeout),
847
m->poll_func_userdata);
852
m->poll_func_ret = ppoll(
853
m->pollfds, m->n_pollfds,
854
m->prepared_timeout == PA_USEC_INVALID ? NULL : pa_timespec_store(&ts, m->prepared_timeout),
857
m->poll_func_ret = pa_poll(
858
m->pollfds, m->n_pollfds,
859
usec_to_timeout(m->prepared_timeout));
863
if (m->poll_func_ret < 0) {
865
m->poll_func_ret = 0;
867
pa_log("poll(): %s", pa_cstrerror(errno));
871
m->state = m->poll_func_ret < 0 ? STATE_PASSIVE : STATE_POLLED;
872
return m->poll_func_ret;
875
m->state = STATE_QUIT;
879
int pa_mainloop_dispatch(pa_mainloop *m) {
880
unsigned dispatched = 0;
883
pa_assert(m->state == STATE_POLLED);
888
if (m->n_enabled_defer_events)
889
dispatched += dispatch_defer(m);
891
if (m->n_enabled_time_events)
892
dispatched += dispatch_timeout(m);
897
if (m->poll_func_ret > 0)
898
dispatched += dispatch_pollfds(m);
904
m->state = STATE_PASSIVE;
906
return (int) dispatched;
909
m->state = STATE_QUIT;
913
int pa_mainloop_get_retval(pa_mainloop *m) {
919
int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval) {
923
if ((r = pa_mainloop_prepare(m, block ? -1 : 0)) < 0)
926
if ((r = pa_mainloop_poll(m)) < 0)
929
if ((r = pa_mainloop_dispatch(m)) < 0)
936
if ((r == -2) && retval)
937
*retval = pa_mainloop_get_retval(m);
941
int pa_mainloop_run(pa_mainloop *m, int *retval) {
944
while ((r = pa_mainloop_iterate(m, 1, retval)) >= 0)
953
void pa_mainloop_quit(pa_mainloop *m, int retval) {
958
pa_mainloop_wakeup(m);
961
pa_mainloop_api* pa_mainloop_get_api(pa_mainloop *m) {
967
void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *userdata) {
970
m->poll_func = poll_func;
971
m->poll_func_userdata = userdata;
974
bool pa_mainloop_is_our_api(pa_mainloop_api *m) {
977
return m->io_new == mainloop_io_new;