struct queue {
struct queue_node *head;
struct queue_node *tail;
+ void (*free_func)(void *data);
};
static inline void cpu_relax(void)
int enqueue(struct queue *queue, void *data);
int dequeue(struct queue *queue, void **data);
-int create_queue(struct queue **queue);
+int create_queue(struct queue **queue, void (*free_func)(void *data));
void destroy_queue(struct queue *queue);
#endif
return 0;
}
-int create_queue(struct queue **queue)
+int create_queue(struct queue **queue, void (*free_func)(void *data))
{
struct queue *new_queue;
struct queue_node *sentinel;
return -ENOMEM;
}
+ new_queue->free_func = free_func;
new_queue->head = new_queue->tail = sentinel;
new_queue->head->data = NULL;
new_queue->head->next = NULL;
void destroy_queue(struct queue *queue)
{
- do { } while (!dequeue(queue, NULL));
+ void *data;
+
+ if (queue->free_func)
+ while (!dequeue(queue, &data))
+ queue->free_func(data);
+ else
+ do { } while (!dequeue(queue, NULL));
/* freeing remaining sentinel */
free(queue->head);