static void asyncmsgq_read_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_event_flags_t events, void *userdata) { pa_thread_mq *q = userdata; pa_asyncmsgq *aq; pa_assert(pa_asyncmsgq_read_fd(q->outq) == fd); pa_assert(events == PA_IO_EVENT_INPUT); pa_asyncmsgq_ref(aq = q->outq); pa_asyncmsgq_read_after_poll(aq); for (;;) { pa_msgobject *object; int code; void *data; int64_t offset; pa_memchunk chunk; /* Check whether there is a message for us to process */ while (pa_asyncmsgq_get(aq, &object, &code, &data, &offset, &chunk, 0) >= 0) { int ret; ret = pa_asyncmsgq_dispatch(object, code, data, offset, &chunk); pa_asyncmsgq_done(aq, ret); } if (pa_asyncmsgq_read_before_poll(aq) == 0) break; } pa_asyncmsgq_unref(aq); }
void pa_asyncmsgq_flush(pa_asyncmsgq *a, bool run) { pa_assert(PA_REFCNT_VALUE(a) > 0); for (;;) { pa_msgobject *object; int code; void *data; int64_t offset; pa_memchunk chunk; int ret; if (pa_asyncmsgq_get(a, &object, &code, &data, &offset, &chunk, false) < 0) return; if (!run) { pa_asyncmsgq_done(a, -1); continue; } pa_asyncmsgq_ref(a); ret = pa_asyncmsgq_dispatch(object, code, data, offset, &chunk); pa_asyncmsgq_done(a, ret); pa_asyncmsgq_unref(a); } }
int pa_asyncmsgq_wait_for(pa_asyncmsgq *a, int code) { int c; pa_assert(PA_REFCNT_VALUE(a) > 0); pa_asyncmsgq_ref(a); do { pa_msgobject *o; void *data; int64_t offset; pa_memchunk chunk; int ret; if (pa_asyncmsgq_get(a, &o, &c, &data, &offset, &chunk, true) < 0) return -1; ret = pa_asyncmsgq_dispatch(o, c, data, offset, &chunk); pa_asyncmsgq_done(a, ret); } while (c != code); pa_asyncmsgq_unref(a); return 0; }
int pa_asyncmsgq_process_one(pa_asyncmsgq *a) { pa_msgobject *object; int code; void *data; pa_memchunk chunk; int64_t offset; int ret; pa_assert(PA_REFCNT_VALUE(a) > 0); if (pa_asyncmsgq_get(a, &object, &code, &data, &offset, &chunk, false) < 0) return 0; pa_asyncmsgq_ref(a); ret = pa_asyncmsgq_dispatch(object, code, data, offset, &chunk); pa_asyncmsgq_done(a, ret); pa_asyncmsgq_unref(a); return 1; }