Lines Matching refs:pd
250 pa_pdispatch *pd;
255 pd = pa_xnew0(pa_pdispatch, 1);
256 PA_REFCNT_INIT(pd);
257 pd->mainloop = mainloop;
258 pd->callback_table = table;
259 pd->n_commands = entries;
260 PA_LLIST_HEAD_INIT(struct reply_info, pd->replies);
261 pd->use_rtclock = use_rtclock;
263 return pd;
266 static void pdispatch_free(pa_pdispatch *pd) {
267 pa_assert(pd);
269 while (pd->replies) {
270 if (pd->replies->free_cb)
271 pd->replies->free_cb(pd->replies->userdata);
273 reply_info_free(pd->replies);
276 pa_xfree(pd);
279 static void run_action(pa_pdispatch *pd, struct reply_info *r, uint32_t command, pa_tagstruct *ts) {
285 pa_pdispatch_ref(pd);
293 callback(pd, command, tag, ts, userdata);
295 if (pd->drain_callback && !pa_pdispatch_is_pending(pd))
296 pd->drain_callback(pd, pd->drain_userdata);
298 pa_pdispatch_unref(pd);
301 int pa_pdispatch_run(pa_pdispatch *pd, pa_packet *packet, pa_cmsg_ancil_data *ancil_data, void *userdata) {
308 pa_assert(pd);
309 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
312 pa_pdispatch_ref(pd);
332 // pa_log("[%p] Received opcode <%s>", pd, p);
339 pd->ancil_data = ancil_data;
344 PA_LLIST_FOREACH(r, pd->replies)
349 run_action(pd, r, command, ts);
351 } else if (pd->callback_table && (command < pd->n_commands) && pd->callback_table[command]) {
352 const pa_pdispatch_cb_t *cb = pd->callback_table+command;
354 (*cb)(pd, command, tag, ts, userdata);
365 pd->ancil_data = NULL;
370 pa_pdispatch_unref(pd);
387 void pa_pdispatch_register_reply(pa_pdispatch *pd, uint32_t tag, int timeout, pa_pdispatch_cb_t cb, void *userdata, pa_free_cb_t free_cb) {
391 pa_assert(pd);
392 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
398 r->pdispatch = pd;
404 pa_assert_se(r->time_event = pd->mainloop->time_new(pd->mainloop,
405 pa_timeval_rtstore(&tv, pa_rtclock_now() + timeout * PA_USEC_PER_SEC, pd->use_rtclock),
408 PA_LLIST_PREPEND(struct reply_info, pd->replies, r);
411 int pa_pdispatch_is_pending(pa_pdispatch *pd) {
412 pa_assert(pd);
413 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
415 return !!pd->replies;
418 void pa_pdispatch_set_drain_callback(pa_pdispatch *pd, pa_pdispatch_drain_cb_t cb, void *userdata) {
419 pa_assert(pd);
420 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
421 pa_assert(!cb || pa_pdispatch_is_pending(pd));
423 pd->drain_callback = cb;
424 pd->drain_userdata = userdata;
427 void pa_pdispatch_unregister_reply(pa_pdispatch *pd, void *userdata) {
430 pa_assert(pd);
431 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
433 PA_LLIST_FOREACH_SAFE(r, n, pd->replies)
438 void pa_pdispatch_unref(pa_pdispatch *pd) {
439 pa_assert(pd);
440 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
442 if (PA_REFCNT_DEC(pd) <= 0)
443 pdispatch_free(pd);
446 pa_pdispatch* pa_pdispatch_ref(pa_pdispatch *pd) {
447 pa_assert(pd);
448 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
450 PA_REFCNT_INC(pd);
451 return pd;
456 const pa_creds * pa_pdispatch_creds(pa_pdispatch *pd) {
457 pa_assert(pd);
458 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
460 if (pd->ancil_data && pd->ancil_data->creds_valid)
461 return &pd->ancil_data->creds;
469 pa_cmsg_ancil_data *pa_pdispatch_take_ancil_data(pa_pdispatch *pd) {
472 pa_assert(pd);
473 pa_assert(PA_REFCNT_VALUE(pd) >= 1);
475 ancil = pd->ancil_data;
481 pd->ancil_data = NULL;