typedef struct pa_flist_elem pa_flist_elem;
struct pa_flist {
+ const char *name;
unsigned size;
/* Stack that contains pointers stored into free list */
pa_atomic_ptr_t stored;
} while (!pa_atomic_ptr_cmpxchg(list, next, new_elem));
}
-pa_flist *pa_flist_new(unsigned size) {
+pa_flist *pa_flist_new_with_name(unsigned size, const char *name) {
pa_flist *l;
unsigned i;
+ pa_assert(name);
if (!size)
size = FLIST_SIZE;
l = pa_xmalloc0(sizeof(pa_flist) + sizeof(pa_flist_elem) * size);
+ l->name = pa_xstrdup(name);
l->size = size;
pa_atomic_ptr_store(&l->stored, NULL);
pa_atomic_ptr_store(&l->empty, NULL);
return l;
}
+pa_flist *pa_flist_new(unsigned size) {
+ return pa_flist_new_with_name(size, "unknown");
+}
+
void pa_flist_free(pa_flist *l, pa_free_cb_t free_cb) {
pa_assert(l);
+ pa_assert(l->name);
if (free_cb) {
pa_flist_elem *elem;
elem = stack_pop(&l->empty);
if (elem == NULL) {
- pa_log_warn("flist is full");
+ if (pa_log_ratelimit(PA_LOG_DEBUG))
+ pa_log_debug("%s flist is full (don't worry)", l->name);
return -1;
}
pa_atomic_ptr_store(&elem->ptr, p);