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, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
38 #include <pulsecore/poll.h>
42 #include <pulsecore/pipe.h>
45 #include <pulse/i18n.h>
46 #include <pulse/rtclock.h>
47 #include <pulse/timeval.h>
48 #include <pulse/xmalloc.h>
50 #include <pulsecore/core-rtclock.h>
51 #include <pulsecore/core-util.h>
52 #include <pulsecore/llist.h>
53 #include <pulsecore/log.h>
54 #include <pulsecore/core-error.h>
55 #include <pulsecore/winsock.h>
56 #include <pulsecore/macro.h>
61 pa_mainloop
*mainloop
;
65 pa_io_event_flags_t events
;
66 struct pollfd
*pollfd
;
68 pa_io_event_cb_t callback
;
70 pa_io_event_destroy_cb_t destroy_callback
;
72 PA_LLIST_FIELDS(pa_io_event
);
75 struct pa_time_event
{
76 pa_mainloop
*mainloop
;
82 pa_time_event_cb_t callback
;
84 pa_time_event_destroy_cb_t destroy_callback
;
86 PA_LLIST_FIELDS(pa_time_event
);
89 struct pa_defer_event
{
90 pa_mainloop
*mainloop
;
95 pa_defer_event_cb_t callback
;
97 pa_defer_event_destroy_cb_t destroy_callback
;
99 PA_LLIST_FIELDS(pa_defer_event
);
103 PA_LLIST_HEAD(pa_io_event
, io_events
);
104 PA_LLIST_HEAD(pa_time_event
, time_events
);
105 PA_LLIST_HEAD(pa_defer_event
, defer_events
);
107 unsigned n_enabled_defer_events
, n_enabled_time_events
, n_io_events
;
108 unsigned io_events_please_scan
, time_events_please_scan
, defer_events_please_scan
;
110 pa_bool_t rebuild_pollfds
:1;
111 struct pollfd
*pollfds
;
112 unsigned max_pollfds
, n_pollfds
;
114 int prepared_timeout
;
115 pa_time_event
*cached_next_time_event
;
122 pa_bool_t wakeup_requested
:1;
124 int wakeup_pipe_type
;
134 pa_poll_func poll_func
;
135 void *poll_func_userdata
;
139 static short map_flags_to_libc(pa_io_event_flags_t flags
) {
141 ((flags
& PA_IO_EVENT_INPUT
? POLLIN
: 0) |
142 (flags
& PA_IO_EVENT_OUTPUT
? POLLOUT
: 0) |
143 (flags
& PA_IO_EVENT_ERROR
? POLLERR
: 0) |
144 (flags
& PA_IO_EVENT_HANGUP
? POLLHUP
: 0));
147 static pa_io_event_flags_t
map_flags_from_libc(short flags
) {
149 (flags
& POLLIN
? PA_IO_EVENT_INPUT
: 0) |
150 (flags
& POLLOUT
? PA_IO_EVENT_OUTPUT
: 0) |
151 (flags
& POLLERR
? PA_IO_EVENT_ERROR
: 0) |
152 (flags
& POLLHUP
? PA_IO_EVENT_HANGUP
: 0);
156 static pa_io_event
* mainloop_io_new(
159 pa_io_event_flags_t events
,
160 pa_io_event_cb_t callback
,
167 pa_assert(a
->userdata
);
172 pa_assert(a
== &m
->api
);
174 e
= pa_xnew(pa_io_event
, 1);
182 e
->callback
= callback
;
183 e
->userdata
= userdata
;
184 e
->destroy_callback
= NULL
;
197 if ((select((SELECT_TYPE_ARG1
) fd
, NULL
, NULL
, SELECT_TYPE_ARG234
&xset
,
198 SELECT_TYPE_ARG5
&tv
) == -1) &&
199 (WSAGetLastError() == WSAENOTSOCK
)) {
200 pa_log_warn("Cannot monitor non-socket file descriptors.");
206 PA_LLIST_PREPEND(pa_io_event
, m
->io_events
, e
);
207 m
->rebuild_pollfds
= TRUE
;
210 pa_mainloop_wakeup(m
);
215 static void mainloop_io_enable(pa_io_event
*e
, pa_io_event_flags_t events
) {
219 if (e
->events
== events
)
225 e
->pollfd
->events
= map_flags_to_libc(events
);
227 e
->mainloop
->rebuild_pollfds
= TRUE
;
229 pa_mainloop_wakeup(e
->mainloop
);
232 static void mainloop_io_free(pa_io_event
*e
) {
237 e
->mainloop
->io_events_please_scan
++;
239 e
->mainloop
->n_io_events
--;
240 e
->mainloop
->rebuild_pollfds
= TRUE
;
242 pa_mainloop_wakeup(e
->mainloop
);
245 static void mainloop_io_set_destroy(pa_io_event
*e
, pa_io_event_destroy_cb_t callback
) {
248 e
->destroy_callback
= callback
;
252 static pa_defer_event
* mainloop_defer_new(
254 pa_defer_event_cb_t callback
,
261 pa_assert(a
->userdata
);
265 pa_assert(a
== &m
->api
);
267 e
= pa_xnew(pa_defer_event
, 1);
272 m
->n_enabled_defer_events
++;
274 e
->callback
= callback
;
275 e
->userdata
= userdata
;
276 e
->destroy_callback
= NULL
;
278 PA_LLIST_PREPEND(pa_defer_event
, m
->defer_events
, e
);
280 pa_mainloop_wakeup(e
->mainloop
);
285 static void mainloop_defer_enable(pa_defer_event
*e
, int b
) {
289 if (e
->enabled
&& !b
) {
290 pa_assert(e
->mainloop
->n_enabled_defer_events
> 0);
291 e
->mainloop
->n_enabled_defer_events
--;
292 } else if (!e
->enabled
&& b
) {
293 e
->mainloop
->n_enabled_defer_events
++;
294 pa_mainloop_wakeup(e
->mainloop
);
300 static void mainloop_defer_free(pa_defer_event
*e
) {
305 e
->mainloop
->defer_events_please_scan
++;
308 pa_assert(e
->mainloop
->n_enabled_defer_events
> 0);
309 e
->mainloop
->n_enabled_defer_events
--;
314 static void mainloop_defer_set_destroy(pa_defer_event
*e
, pa_defer_event_destroy_cb_t callback
) {
318 e
->destroy_callback
= callback
;
322 static pa_usec_t
timeval_load(const struct timeval
*tv
) {
323 pa_bool_t is_rtclock
;
327 return PA_USEC_INVALID
;
330 is_rtclock
= !!(ttv
.tv_usec
& PA_TIMEVAL_RTCLOCK
);
331 ttv
.tv_usec
&= ~PA_TIMEVAL_RTCLOCK
;
334 pa_rtclock_from_wallclock(&ttv
);
336 return pa_timeval_load(&ttv
);
339 static pa_time_event
* mainloop_time_new(
341 const struct timeval
*tv
,
342 pa_time_event_cb_t callback
,
350 pa_assert(a
->userdata
);
353 t
= timeval_load(tv
);
356 pa_assert(a
== &m
->api
);
358 e
= pa_xnew(pa_time_event
, 1);
362 if ((e
->enabled
= (t
!= PA_USEC_INVALID
))) {
365 m
->n_enabled_time_events
++;
367 if (m
->cached_next_time_event
) {
368 pa_assert(m
->cached_next_time_event
->enabled
);
370 if (t
< m
->cached_next_time_event
->time
)
371 m
->cached_next_time_event
= e
;
375 e
->callback
= callback
;
376 e
->userdata
= userdata
;
377 e
->destroy_callback
= NULL
;
379 PA_LLIST_PREPEND(pa_time_event
, m
->time_events
, e
);
382 pa_mainloop_wakeup(m
);
387 static void mainloop_time_restart(pa_time_event
*e
, const struct timeval
*tv
) {
394 t
= timeval_load(tv
);
396 valid
= (t
!= PA_USEC_INVALID
);
397 if (e
->enabled
&& !valid
) {
398 pa_assert(e
->mainloop
->n_enabled_time_events
> 0);
399 e
->mainloop
->n_enabled_time_events
--;
400 } else if (!e
->enabled
&& valid
)
401 e
->mainloop
->n_enabled_time_events
++;
403 if ((e
->enabled
= valid
)) {
405 pa_mainloop_wakeup(e
->mainloop
);
408 if (e
->mainloop
->cached_next_time_event
&& e
->enabled
) {
409 pa_assert(e
->mainloop
->cached_next_time_event
->enabled
);
411 if (t
< e
->mainloop
->cached_next_time_event
->time
)
412 e
->mainloop
->cached_next_time_event
= e
;
413 } else if (e
->mainloop
->cached_next_time_event
== e
)
414 e
->mainloop
->cached_next_time_event
= NULL
;
417 static void mainloop_time_free(pa_time_event
*e
) {
422 e
->mainloop
->time_events_please_scan
++;
425 pa_assert(e
->mainloop
->n_enabled_time_events
> 0);
426 e
->mainloop
->n_enabled_time_events
--;
430 if (e
->mainloop
->cached_next_time_event
== e
)
431 e
->mainloop
->cached_next_time_event
= NULL
;
433 /* no wakeup needed here. Think about it! */
436 static void mainloop_time_set_destroy(pa_time_event
*e
, pa_time_event_destroy_cb_t callback
) {
440 e
->destroy_callback
= callback
;
445 static void mainloop_quit(pa_mainloop_api
*a
, int retval
) {
449 pa_assert(a
->userdata
);
451 pa_assert(a
== &m
->api
);
453 pa_mainloop_quit(m
, retval
);
456 static const pa_mainloop_api vtable
= {
459 .io_new
= mainloop_io_new
,
460 .io_enable
= mainloop_io_enable
,
461 .io_free
= mainloop_io_free
,
462 .io_set_destroy
= mainloop_io_set_destroy
,
464 .time_new
= mainloop_time_new
,
465 .time_restart
= mainloop_time_restart
,
466 .time_free
= mainloop_time_free
,
467 .time_set_destroy
= mainloop_time_set_destroy
,
469 .defer_new
= mainloop_defer_new
,
470 .defer_enable
= mainloop_defer_enable
,
471 .defer_free
= mainloop_defer_free
,
472 .defer_set_destroy
= mainloop_defer_set_destroy
,
474 .quit
= mainloop_quit
,
477 pa_mainloop
*pa_mainloop_new(void) {
482 m
= pa_xnew(pa_mainloop
, 1);
484 m
->wakeup_pipe_type
= 0;
485 if (pipe(m
->wakeup_pipe
) < 0) {
486 pa_log_error("ERROR: cannot create wakeup pipe");
491 pa_make_fd_nonblock(m
->wakeup_pipe
[0]);
492 pa_make_fd_nonblock(m
->wakeup_pipe
[1]);
493 pa_make_fd_cloexec(m
->wakeup_pipe
[0]);
494 pa_make_fd_cloexec(m
->wakeup_pipe
[1]);
495 m
->wakeup_requested
= FALSE
;
497 PA_LLIST_HEAD_INIT(pa_io_event
, m
->io_events
);
498 PA_LLIST_HEAD_INIT(pa_time_event
, m
->time_events
);
499 PA_LLIST_HEAD_INIT(pa_defer_event
, m
->defer_events
);
501 m
->n_enabled_defer_events
= m
->n_enabled_time_events
= m
->n_io_events
= 0;
502 m
->io_events_please_scan
= m
->time_events_please_scan
= m
->defer_events_please_scan
= 0;
504 m
->cached_next_time_event
= NULL
;
505 m
->prepared_timeout
= 0;
508 m
->max_pollfds
= m
->n_pollfds
= 0;
509 m
->rebuild_pollfds
= TRUE
;
517 m
->state
= STATE_PASSIVE
;
520 m
->poll_func_userdata
= NULL
;
521 m
->poll_func_ret
= -1;
526 static void cleanup_io_events(pa_mainloop
*m
, pa_bool_t force
) {
531 pa_io_event
*n
= e
->next
;
533 if (!force
&& m
->io_events_please_scan
<= 0)
536 if (force
|| e
->dead
) {
537 PA_LLIST_REMOVE(pa_io_event
, m
->io_events
, e
);
540 pa_assert(m
->io_events_please_scan
> 0);
541 m
->io_events_please_scan
--;
544 if (e
->destroy_callback
)
545 e
->destroy_callback(&m
->api
, e
, e
->userdata
);
549 m
->rebuild_pollfds
= TRUE
;
555 pa_assert(m
->io_events_please_scan
== 0);
558 static void cleanup_time_events(pa_mainloop
*m
, pa_bool_t force
) {
563 pa_time_event
*n
= e
->next
;
565 if (!force
&& m
->time_events_please_scan
<= 0)
568 if (force
|| e
->dead
) {
569 PA_LLIST_REMOVE(pa_time_event
, m
->time_events
, e
);
572 pa_assert(m
->time_events_please_scan
> 0);
573 m
->time_events_please_scan
--;
576 if (!e
->dead
&& e
->enabled
) {
577 pa_assert(m
->n_enabled_time_events
> 0);
578 m
->n_enabled_time_events
--;
582 if (e
->destroy_callback
)
583 e
->destroy_callback(&m
->api
, e
, e
->userdata
);
591 pa_assert(m
->time_events_please_scan
== 0);
594 static void cleanup_defer_events(pa_mainloop
*m
, pa_bool_t force
) {
599 pa_defer_event
*n
= e
->next
;
601 if (!force
&& m
->defer_events_please_scan
<= 0)
604 if (force
|| e
->dead
) {
605 PA_LLIST_REMOVE(pa_defer_event
, m
->defer_events
, e
);
608 pa_assert(m
->defer_events_please_scan
> 0);
609 m
->defer_events_please_scan
--;
612 if (!e
->dead
&& e
->enabled
) {
613 pa_assert(m
->n_enabled_defer_events
> 0);
614 m
->n_enabled_defer_events
--;
618 if (e
->destroy_callback
)
619 e
->destroy_callback(&m
->api
, e
, e
->userdata
);
627 pa_assert(m
->defer_events_please_scan
== 0);
631 void pa_mainloop_free(pa_mainloop
* m
) {
634 cleanup_io_events(m
, TRUE
);
635 cleanup_defer_events(m
, TRUE
);
636 cleanup_time_events(m
, TRUE
);
638 pa_xfree(m
->pollfds
);
640 pa_close_pipe(m
->wakeup_pipe
);
645 static void scan_dead(pa_mainloop
*m
) {
648 if (m
->io_events_please_scan
)
649 cleanup_io_events(m
, FALSE
);
651 if (m
->time_events_please_scan
)
652 cleanup_time_events(m
, FALSE
);
654 if (m
->defer_events_please_scan
)
655 cleanup_defer_events(m
, FALSE
);
658 static void rebuild_pollfds(pa_mainloop
*m
) {
663 l
= m
->n_io_events
+ 1;
664 if (m
->max_pollfds
< l
) {
666 m
->pollfds
= pa_xrealloc(m
->pollfds
, sizeof(struct pollfd
)*l
);
673 if (m
->wakeup_pipe
[0] >= 0) {
674 m
->pollfds
[0].fd
= m
->wakeup_pipe
[0];
675 m
->pollfds
[0].events
= POLLIN
;
676 m
->pollfds
[0].revents
= 0;
681 for (e
= m
->io_events
; e
; e
= e
->next
) {
689 p
->events
= map_flags_to_libc(e
->events
);
696 m
->rebuild_pollfds
= FALSE
;
699 static int dispatch_pollfds(pa_mainloop
*m
) {
703 pa_assert(m
->poll_func_ret
> 0);
705 for (e
= m
->io_events
, k
= m
->poll_func_ret
; e
&& !m
->quit
&& k
> 0; e
= e
->next
) {
706 if (e
->dead
|| !e
->pollfd
|| !e
->pollfd
->revents
)
709 pa_assert(e
->pollfd
->fd
== e
->fd
);
710 pa_assert(e
->callback
);
711 e
->callback(&m
->api
, e
, e
->fd
, map_flags_from_libc(e
->pollfd
->revents
), e
->userdata
);
712 e
->pollfd
->revents
= 0;
721 static int dispatch_defer(pa_mainloop
*m
) {
725 if (m
->n_enabled_defer_events
<= 0)
728 for (e
= m
->defer_events
; e
&& !m
->quit
; e
= e
->next
) {
729 if (e
->dead
|| !e
->enabled
)
732 pa_assert(e
->callback
);
733 e
->callback(&m
->api
, e
, e
->userdata
);
740 static pa_time_event
* find_next_time_event(pa_mainloop
*m
) {
741 pa_time_event
*t
, *n
= NULL
;
744 if (m
->cached_next_time_event
)
745 return m
->cached_next_time_event
;
747 for (t
= m
->time_events
; t
; t
= t
->next
) {
749 if (t
->dead
|| !t
->enabled
)
752 if (!n
|| t
->time
< n
->time
) {
755 /* Shortcut for time == 0 */
761 m
->cached_next_time_event
= n
;
765 static int calc_next_timeout(pa_mainloop
*m
) {
769 if (!m
->n_enabled_time_events
)
772 t
= find_next_time_event(m
);
778 usec
= t
->time
- pa_rtclock_now();
783 return (int) (usec
/ 1000); /* in milliseconds */
786 static int dispatch_timeout(pa_mainloop
*m
) {
792 if (m
->n_enabled_time_events
<= 0)
795 now
= pa_rtclock_now();
797 for (e
= m
->time_events
; e
&& !m
->quit
; e
= e
->next
) {
799 if (e
->dead
|| !e
->enabled
)
802 if (e
->time
<= now
) {
804 pa_assert(e
->callback
);
806 /* Disable time event */
807 mainloop_time_restart(e
, NULL
);
809 e
->callback(&m
->api
, e
, pa_timeval_rtstore(&tv
, e
->time
, TRUE
), e
->userdata
);
818 void pa_mainloop_wakeup(pa_mainloop
*m
) {
822 if (m
->wakeup_pipe
[1] >= 0 && m
->state
== STATE_POLLING
) {
823 pa_write(m
->wakeup_pipe
[1], &c
, sizeof(c
), &m
->wakeup_pipe_type
);
824 m
->wakeup_requested
++;
828 static void clear_wakeup(pa_mainloop
*m
) {
833 if (m
->wakeup_pipe
[0] < 0)
836 if (m
->wakeup_requested
) {
837 while (pa_read(m
->wakeup_pipe
[0], &c
, sizeof(c
), &m
->wakeup_pipe_type
) == sizeof(c
));
838 m
->wakeup_requested
= 0;
842 int pa_mainloop_prepare(pa_mainloop
*m
, int timeout
) {
844 pa_assert(m
->state
== STATE_PASSIVE
);
852 if (m
->n_enabled_defer_events
<= 0) {
853 if (m
->rebuild_pollfds
)
856 m
->prepared_timeout
= calc_next_timeout(m
);
857 if (timeout
>= 0 && (timeout
< m
->prepared_timeout
|| m
->prepared_timeout
< 0))
858 m
->prepared_timeout
= timeout
;
861 m
->state
= STATE_PREPARED
;
865 m
->state
= STATE_QUIT
;
869 int pa_mainloop_poll(pa_mainloop
*m
) {
871 pa_assert(m
->state
== STATE_PREPARED
);
876 m
->state
= STATE_POLLING
;
878 if (m
->n_enabled_defer_events
)
879 m
->poll_func_ret
= 0;
881 pa_assert(!m
->rebuild_pollfds
);
884 m
->poll_func_ret
= m
->poll_func(m
->pollfds
, m
->n_pollfds
, m
->prepared_timeout
, m
->poll_func_userdata
);
886 m
->poll_func_ret
= poll(m
->pollfds
, m
->n_pollfds
, m
->prepared_timeout
);
888 if (m
->poll_func_ret
< 0) {
890 m
->poll_func_ret
= 0;
892 pa_log("poll(): %s", pa_cstrerror(errno
));
896 m
->state
= m
->poll_func_ret
< 0 ? STATE_PASSIVE
: STATE_POLLED
;
897 return m
->poll_func_ret
;
900 m
->state
= STATE_QUIT
;
904 int pa_mainloop_dispatch(pa_mainloop
*m
) {
908 pa_assert(m
->state
== STATE_POLLED
);
913 if (m
->n_enabled_defer_events
)
914 dispatched
+= dispatch_defer(m
);
916 if (m
->n_enabled_time_events
)
917 dispatched
+= dispatch_timeout(m
);
922 if (m
->poll_func_ret
> 0)
923 dispatched
+= dispatch_pollfds(m
);
929 m
->state
= STATE_PASSIVE
;
934 m
->state
= STATE_QUIT
;
938 int pa_mainloop_get_retval(pa_mainloop
*m
) {
943 int pa_mainloop_iterate(pa_mainloop
*m
, int block
, int *retval
) {
947 if ((r
= pa_mainloop_prepare(m
, block
? -1 : 0)) < 0)
950 if ((r
= pa_mainloop_poll(m
)) < 0)
953 if ((r
= pa_mainloop_dispatch(m
)) < 0)
960 if ((r
== -2) && retval
)
961 *retval
= pa_mainloop_get_retval(m
);
965 int pa_mainloop_run(pa_mainloop
*m
, int *retval
) {
968 while ((r
= pa_mainloop_iterate(m
, 1, retval
)) >= 0);
978 void pa_mainloop_quit(pa_mainloop
*m
, int retval
) {
983 pa_mainloop_wakeup(m
);
986 pa_mainloop_api
* pa_mainloop_get_api(pa_mainloop
*m
) {
991 void pa_mainloop_set_poll_func(pa_mainloop
*m
, pa_poll_func poll_func
, void *userdata
) {
994 m
->poll_func
= poll_func
;
995 m
->poll_func_userdata
= userdata
;