From eb912d3605e86509b0e69aa37ba2b3fad805df63 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Thu, 12 May 2016 18:05:14 +0530 Subject: [PATCH] rtpoll: Separate out before/after/work callback userdata It is possible that we might want to have a separate userdata to be used for these callbacks, so let's split them out. This is particularly needed when using an pa_rtpoll_item around pa_fdsem since that uses its own before/after callback but will essentially have whatever is using the fdsem set up the work callback appropriately (and thus at least the work callback's userdata needs to be separated from the before/after callback -- we might as well then just separate all three). Signed-off-by: Arun Raghavan --- src/modules/alsa/alsa-mixer.c | 5 +-- src/modules/rtp/module-rtp-recv.c | 5 +-- src/pulsecore/rtpoll.c | 63 +++++++++++++++---------------- src/pulsecore/rtpoll.h | 9 ++--- src/tests/rtpoll-test.c | 10 ++--- 5 files changed, 43 insertions(+), 49 deletions(-) diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c index cd99a75f8..1309cec5d 100644 --- a/src/modules/alsa/alsa-mixer.c +++ b/src/modules/alsa/alsa-mixer.c @@ -467,7 +467,7 @@ static int rtpoll_work_cb(pa_rtpoll_item *i) { unsigned short revents = 0; int err, ret = 0; - pd = pa_rtpoll_item_get_userdata(i); + pd = pa_rtpoll_item_get_work_userdata(i); pa_assert_fp(pd); pa_assert_fp(i == pd->poll_item); @@ -547,8 +547,7 @@ int pa_alsa_set_mixer_rtpoll(struct pa_alsa_mixer_pdata *pd, snd_mixer_t *mixer, pd->poll_item = i; pd->mixer = mixer; - pa_rtpoll_item_set_userdata(i, pd); - pa_rtpoll_item_set_work_callback(i, rtpoll_work_cb); + pa_rtpoll_item_set_work_callback(i, rtpoll_work_cb, pd); return 0; } diff --git a/src/modules/rtp/module-rtp-recv.c b/src/modules/rtp/module-rtp-recv.c index 4e78cb432..5733dbae1 100644 --- a/src/modules/rtp/module-rtp-recv.c +++ b/src/modules/rtp/module-rtp-recv.c @@ -210,7 +210,7 @@ static int rtpoll_work_cb(pa_rtpoll_item *i) { struct session *s; struct pollfd *p; - pa_assert_se(s = pa_rtpoll_item_get_userdata(i)); + pa_assert_se(s = pa_rtpoll_item_get_work_userdata(i)); p = pa_rtpoll_item_get_pollfd(i, NULL); @@ -383,8 +383,7 @@ static void sink_input_attach(pa_sink_input *i) { pa_assert(!s->rtpoll_item); s->rtpoll_item = pa_rtp_context_get_rtpoll_item(s->rtp_context, i->sink->thread_info.rtpoll); - pa_rtpoll_item_set_work_callback(s->rtpoll_item, rtpoll_work_cb); - pa_rtpoll_item_set_userdata(s->rtpoll_item, s); + pa_rtpoll_item_set_work_callback(s->rtpoll_item, rtpoll_work_cb, s); } /* Called from I/O thread context */ diff --git a/src/pulsecore/rtpoll.c b/src/pulsecore/rtpoll.c index 98cf88ff2..1085bf957 100644 --- a/src/pulsecore/rtpoll.c +++ b/src/pulsecore/rtpoll.c @@ -77,7 +77,9 @@ struct pa_rtpoll_item { int (*work_cb)(pa_rtpoll_item *i); int (*before_cb)(pa_rtpoll_item *i); void (*after_cb)(pa_rtpoll_item *i); - void *userdata; + void *work_userdata; + void *before_userdata; + void *after_userdata; PA_LLIST_FIELDS(pa_rtpoll_item); }; @@ -411,7 +413,9 @@ pa_rtpoll_item *pa_rtpoll_item_new(pa_rtpoll *p, pa_rtpoll_priority_t prio, unsi i->pollfd = NULL; i->priority = prio; - i->userdata = NULL; + i->work_userdata = NULL; + i->before_userdata = NULL; + i->work_userdata = NULL; i->before_cb = NULL; i->after_cb = NULL; i->work_cb = NULL; @@ -458,42 +462,39 @@ struct pollfd *pa_rtpoll_item_get_pollfd(pa_rtpoll_item *i, unsigned *n_fds) { return i->pollfd; } -void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i)) { +void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i), void *userdata) { pa_assert(i); pa_assert(i->priority < PA_RTPOLL_NEVER); i->before_cb = before_cb; + i->before_userdata = userdata; } -void pa_rtpoll_item_set_after_callback(pa_rtpoll_item *i, void (*after_cb)(pa_rtpoll_item *i)) { +void pa_rtpoll_item_set_after_callback(pa_rtpoll_item *i, void (*after_cb)(pa_rtpoll_item *i), void *userdata) { pa_assert(i); pa_assert(i->priority < PA_RTPOLL_NEVER); i->after_cb = after_cb; + i->after_userdata = userdata; } -void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i)) { +void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i), void *userdata) { pa_assert(i); pa_assert(i->priority < PA_RTPOLL_NEVER); i->work_cb = work_cb; + i->work_userdata = userdata; } -void pa_rtpoll_item_set_userdata(pa_rtpoll_item *i, void *userdata) { +void* pa_rtpoll_item_get_work_userdata(pa_rtpoll_item *i) { pa_assert(i); - i->userdata = userdata; -} - -void* pa_rtpoll_item_get_userdata(pa_rtpoll_item *i) { - pa_assert(i); - - return i->userdata; + return i->work_userdata; } static int fdsem_before(pa_rtpoll_item *i) { - if (pa_fdsem_before_poll(i->userdata) < 0) + if (pa_fdsem_before_poll(i->before_userdata) < 0) return 1; /* 1 means immediate restart of the loop */ return 0; @@ -503,7 +504,7 @@ static void fdsem_after(pa_rtpoll_item *i) { pa_assert(i); pa_assert((i->pollfd[0].revents & ~POLLIN) == 0); - pa_fdsem_after_poll(i->userdata); + pa_fdsem_after_poll(i->after_userdata); } pa_rtpoll_item *pa_rtpoll_item_new_fdsem(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_fdsem *f) { @@ -520,9 +521,8 @@ pa_rtpoll_item *pa_rtpoll_item_new_fdsem(pa_rtpoll *p, pa_rtpoll_priority_t prio pollfd->fd = pa_fdsem_get(f); pollfd->events = POLLIN; - i->before_cb = fdsem_before; - i->after_cb = fdsem_after; - i->userdata = f; + pa_rtpoll_item_set_before_callback(i, fdsem_before, f); + pa_rtpoll_item_set_after_callback(i, fdsem_after, f); return i; } @@ -530,7 +530,7 @@ pa_rtpoll_item *pa_rtpoll_item_new_fdsem(pa_rtpoll *p, pa_rtpoll_priority_t prio static int asyncmsgq_read_before(pa_rtpoll_item *i) { pa_assert(i); - if (pa_asyncmsgq_read_before_poll(i->userdata) < 0) + if (pa_asyncmsgq_read_before_poll(i->before_userdata) < 0) return 1; /* 1 means immediate restart of the loop */ return 0; @@ -540,7 +540,7 @@ static void asyncmsgq_read_after(pa_rtpoll_item *i) { pa_assert(i); pa_assert((i->pollfd[0].revents & ~POLLIN) == 0); - pa_asyncmsgq_read_after_poll(i->userdata); + pa_asyncmsgq_read_after_poll(i->after_userdata); } static int asyncmsgq_read_work(pa_rtpoll_item *i) { @@ -552,11 +552,11 @@ static int asyncmsgq_read_work(pa_rtpoll_item *i) { pa_assert(i); - if (pa_asyncmsgq_get(i->userdata, &object, &code, &data, &offset, &chunk, 0) == 0) { + if (pa_asyncmsgq_get(i->work_userdata, &object, &code, &data, &offset, &chunk, 0) == 0) { int ret; if (!object && code == PA_MESSAGE_SHUTDOWN) { - pa_asyncmsgq_done(i->userdata, 0); + pa_asyncmsgq_done(i->work_userdata, 0); /* Requests the loop to exit. Will cause the next iteration of * pa_rtpoll_run() to return 0 */ i->rtpoll->quit = true; @@ -564,7 +564,7 @@ static int asyncmsgq_read_work(pa_rtpoll_item *i) { } ret = pa_asyncmsgq_dispatch(object, code, data, offset, &chunk); - pa_asyncmsgq_done(i->userdata, ret); + pa_asyncmsgq_done(i->work_userdata, ret); return 1; } @@ -584,10 +584,9 @@ pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_read(pa_rtpoll *p, pa_rtpoll_priori pollfd->fd = pa_asyncmsgq_read_fd(q); pollfd->events = POLLIN; - i->before_cb = asyncmsgq_read_before; - i->after_cb = asyncmsgq_read_after; - i->work_cb = asyncmsgq_read_work; - i->userdata = q; + pa_rtpoll_item_set_before_callback(i, asyncmsgq_read_before, q); + pa_rtpoll_item_set_after_callback(i, asyncmsgq_read_after, q); + pa_rtpoll_item_set_work_callback(i, asyncmsgq_read_work, q); return i; } @@ -595,7 +594,7 @@ pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_read(pa_rtpoll *p, pa_rtpoll_priori static int asyncmsgq_write_before(pa_rtpoll_item *i) { pa_assert(i); - pa_asyncmsgq_write_before_poll(i->userdata); + pa_asyncmsgq_write_before_poll(i->before_userdata); return 0; } @@ -603,7 +602,7 @@ static void asyncmsgq_write_after(pa_rtpoll_item *i) { pa_assert(i); pa_assert((i->pollfd[0].revents & ~POLLIN) == 0); - pa_asyncmsgq_write_after_poll(i->userdata); + pa_asyncmsgq_write_after_poll(i->after_userdata); } pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_write(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_asyncmsgq *q) { @@ -619,10 +618,8 @@ pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_write(pa_rtpoll *p, pa_rtpoll_prior pollfd->fd = pa_asyncmsgq_write_fd(q); pollfd->events = POLLIN; - i->before_cb = asyncmsgq_write_before; - i->after_cb = asyncmsgq_write_after; - i->work_cb = NULL; - i->userdata = q; + pa_rtpoll_item_set_before_callback(i, asyncmsgq_write_before, q); + pa_rtpoll_item_set_after_callback(i, asyncmsgq_write_after, q); return i; } diff --git a/src/pulsecore/rtpoll.h b/src/pulsecore/rtpoll.h index 8f0715ac1..121b51e3b 100644 --- a/src/pulsecore/rtpoll.h +++ b/src/pulsecore/rtpoll.h @@ -80,19 +80,18 @@ struct pollfd *pa_rtpoll_item_get_pollfd(pa_rtpoll_item *i, unsigned *n_fds); /* Set the callback that shall be called when there's time to do some work: If the * callback returns a value > 0, the poll is skipped and the next * iteration of the loop will start immediately. */ -void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i)); +void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i), void *userdata); /* Set the callback that shall be called immediately before entering * the sleeping poll: If the callback returns a value > 0, the poll is * skipped and the next iteration of the loop will start immediately. */ -void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i)); +void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i), void *userdata); /* Set the callback that shall be called immediately after having * entered the sleeping poll */ -void pa_rtpoll_item_set_after_callback(pa_rtpoll_item *i, void (*after_cb)(pa_rtpoll_item *i)); +void pa_rtpoll_item_set_after_callback(pa_rtpoll_item *i, void (*after_cb)(pa_rtpoll_item *i), void *userdata); -void pa_rtpoll_item_set_userdata(pa_rtpoll_item *i, void *userdata); -void* pa_rtpoll_item_get_userdata(pa_rtpoll_item *i); +void* pa_rtpoll_item_get_work_userdata(pa_rtpoll_item *i); pa_rtpoll_item *pa_rtpoll_item_new_fdsem(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_fdsem *s); pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_read(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_asyncmsgq *q); diff --git a/src/tests/rtpoll-test.c b/src/tests/rtpoll-test.c index 24c661968..aab637be1 100644 --- a/src/tests/rtpoll-test.c +++ b/src/tests/rtpoll-test.c @@ -48,15 +48,15 @@ START_TEST (rtpoll_test) { p = pa_rtpoll_new(); i = pa_rtpoll_item_new(p, PA_RTPOLL_EARLY, 1); - pa_rtpoll_item_set_before_callback(i, before); - pa_rtpoll_item_set_after_callback(i, after); + pa_rtpoll_item_set_before_callback(i, before, NULL); + pa_rtpoll_item_set_after_callback(i, after, NULL); pollfd = pa_rtpoll_item_get_pollfd(i, NULL); pollfd->fd = 0; pollfd->events = POLLIN; w = pa_rtpoll_item_new(p, PA_RTPOLL_NORMAL, 0); - pa_rtpoll_item_set_before_callback(w, worker); + pa_rtpoll_item_set_before_callback(w, worker, NULL); pa_rtpoll_set_timer_relative(p, 10000000); /* 10 s */ @@ -65,8 +65,8 @@ START_TEST (rtpoll_test) { pa_rtpoll_item_free(i); i = pa_rtpoll_item_new(p, PA_RTPOLL_EARLY, 1); - pa_rtpoll_item_set_before_callback(i, before); - pa_rtpoll_item_set_after_callback(i, after); + pa_rtpoll_item_set_before_callback(i, before, NULL); + pa_rtpoll_item_set_after_callback(i, after, NULL); pollfd = pa_rtpoll_item_get_pollfd(i, NULL); pollfd->fd = 0;