void pa_asyncmsgq_done(pa_asyncmsgq *a, int ret) { pa_assert(PA_REFCNT_VALUE(a) > 0); pa_assert(a); pa_assert(a->current); if (a->current->semaphore) { a->current->ret = ret; pa_semaphore_post(a->current->semaphore); } else { if (a->current->free_cb) a->current->free_cb(a->current->userdata); if (a->current->object) pa_msgobject_unref(a->current->object); if (a->current->memchunk.memblock) pa_memblock_unref(a->current->memchunk.memblock); if (pa_flist_push(PA_STATIC_FLIST_GET(asyncmsgq), a->current) < 0) pa_xfree(a->current); } a->current = NULL; }
/* No lock necessary, in corner cases locks by its own */ void pa_memblock_release(pa_memblock *b) { int r; pa_assert(b); pa_assert(PA_REFCNT_VALUE(b) > 0); r = pa_atomic_dec(&b->n_acquired); pa_assert(r >= 1); /* Signal a waiting thread that this memblock is no longer used */ if (r == 1 && pa_atomic_load(&b->please_signal)) pa_semaphore_post(b->pool->semaphore); }
void pa_aupdate_read_end(pa_aupdate *a) { unsigned PA_UNUSED n; pa_assert(a); /* Decrease the lock counter */ n = (unsigned) pa_atomic_dec(&a->read_lock); /* Make sure the counter was valid */ pa_assert(COUNTER(n) > 0); /* Post the semaphore */ pa_semaphore_post(a->semaphore); }