From 76296ca8adccec12aa84163da55c6204d7667bf5 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 16 Apr 2006 16:46:26 +0000 Subject: add new API to replace the poll() function used by the main loop implementation git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@733 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/polyp/mainloop.c | 19 ++++++++++++++++++- src/polyp/mainloop.h | 8 ++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/polyp/mainloop.c b/src/polyp/mainloop.c index da3f57b2..87ef623e 100644 --- a/src/polyp/mainloop.c +++ b/src/polyp/mainloop.c @@ -101,6 +101,9 @@ struct pa_mainloop { STATE_POLLED, STATE_QUIT } state; + + pa_poll_func poll_func; + void *poll_func_userdata; }; /* IO events */ @@ -355,6 +358,9 @@ pa_mainloop *pa_mainloop_new(void) { m->deferred_pending = 0; m->state = STATE_PASSIVE; + + m->poll_func = NULL; + m->poll_func_userdata = NULL; return m; } @@ -665,7 +671,10 @@ int pa_mainloop_poll(pa_mainloop *m) { if (m->deferred_pending) r = 0; else { - r = poll(m->pollfds, m->n_pollfds, m->prepared_timeout); + if (m->poll_func) + r = m->poll_func(m->pollfds, m->n_pollfds, m->prepared_timeout, m->poll_func_userdata); + else + r = poll(m->pollfds, m->n_pollfds, m->prepared_timeout); if (r < 0) { if (errno == EINTR) @@ -767,6 +776,14 @@ pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m) { return &m->api; } +void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *userdata) { + assert(m); + + m->poll_func = poll_func; + m->poll_func_userdata = userdata; +} + + #if 0 void pa_mainloop_dump(pa_mainloop *m) { assert(m); diff --git a/src/polyp/mainloop.h b/src/polyp/mainloop.h index fe2b4c5b..f60c355a 100644 --- a/src/polyp/mainloop.h +++ b/src/polyp/mainloop.h @@ -70,6 +70,8 @@ PA_C_DECL_BEGIN * defined in \ref mainloop-api.h. This implementation is thread safe * as long as you access the main loop object from a single thread only.*/ +#include + /** An opaque main loop object */ typedef struct pa_mainloop pa_mainloop; @@ -114,6 +116,12 @@ void pa_mainloop_quit(pa_mainloop *m, int r); /** Interrupt a running poll (for threaded systems) */ void pa_mainloop_wakeup(pa_mainloop *m); +/** Generic prototype of a poll() like function */ +typedef int (*pa_poll_func)(struct pollfd *ufds, nfds_t nfds, int timeout, void*userdata); + +/** Change the poll() implementation */ +void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *userdata); + PA_C_DECL_END #endif -- cgit