queue_unref(queue);
}
-static struct queue_entry *queue_entry_ref(struct queue_entry *entry)
-{
- if (!entry)
- return NULL;
-
- __sync_fetch_and_add(&entry->ref_count, 1);
-
- return entry;
-}
-
-static void queue_entry_unref(struct queue_entry *entry)
-{
- if (__sync_sub_and_fetch(&entry->ref_count, 1))
- return;
-
- free(entry);
-}
-
static struct queue_entry *queue_entry_new(void *data)
{
struct queue_entry *entry;
entry = new0(struct queue_entry, 1);
entry->data = data;
- return queue_entry_ref(entry);
+ return entry;
}
bool queue_push_tail(struct queue *queue, void *data)
data = entry->data;
- queue_entry_unref(entry);
+ free(entry);
queue->entries--;
return data;
while (entry && queue->head && queue->ref_count > 1) {
struct queue_entry *next;
- queue_entry_ref(entry);
-
- function(entry->data, user_data);
-
next = entry->next;
-
- queue_entry_unref(entry);
-
+ function(entry->data, user_data);
entry = next;
}
queue_unref(queue);
if (!entry->next)
queue->tail = prev;
- queue_entry_unref(entry);
+ free(entry);
queue->entries--;
return true;
data = entry->data;
- queue_entry_unref(entry);
+ free(entry);
queue->entries--;
return data;
if (destroy)
destroy(tmp->data);
- queue_entry_unref(tmp);
+ free(tmp);
count++;
}
}