pa_asyncq *pa_asyncq_new(unsigned size) { pa_asyncq *l; if (!size) size = ASYNCQ_SIZE; pa_assert(pa_is_power_of_two(size)); l = pa_xmalloc0(PA_ALIGN(sizeof(pa_asyncq)) + (sizeof(pa_atomic_ptr_t) * size)); l->size = size; PA_LLIST_HEAD_INIT(struct localq, l->localq); l->last_localq = NULL; l->waiting_for_post = FALSE; if (!(l->read_fdsem = pa_fdsem_new())) { pa_xfree(l); return NULL; } if (!(l->write_fdsem = pa_fdsem_new())) { pa_fdsem_free(l->read_fdsem); pa_xfree(l); return NULL; } return l; }
pa_shmasyncq *pa_shmasyncq_new(unsigned n_elements, size_t element_size, void *data, int fd[2]) { pa_shmasyncq *l; pa_assert(n_elements > 0); pa_assert(is_power_of_two(n_elements)); pa_assert(element_size > 0); pa_assert(data); pa_assert(fd); l = pa_xnew(pa_shmasyncq, 1); l->data = data; memset(data, 0, PA_SHMASYNCQ_SIZE(n_elements, element_size)); l->data->n_elements = n_elements; l->data->element_size = element_size; if (!(l->read_fdsem = pa_fdsem_new_shm(&d->read_fdsem_data))) { pa_xfree(l); return NULL; } fd[0] = pa_fdsem_get(l->read_fdsem); if (!(l->write_fdsem = pa_fdsem_new(&d->write_fdsem_data, &fd[1]))) { pa_fdsem_free(l->read_fdsem); pa_xfree(l); return NULL; } return l; }