void list_free_node(list_node_t *node, list_free_data_fn *free_data_fn) { if (node) { if (free_data_fn) free_data_fn(node->data); free(node); } }
void stack_clear(struct stack *s, void (*free_data_fn)(void *)) { if (s == NULL) { return; } if (free_data_fn) { while (s->sp > 0) { free_data_fn(s->array[--(s->sp)]); } } }
void free_spin_lock_queue(sl_queue_t* q, void(*free_data_fn(void*))) { sl_queue_node_t* it; void *data; spin_lock_bh(&(q->queue_lock)); it = q->first; while (it != NULL) { q->first = q->first->next; data = free_spin_lock_queue_node(it); if (data && free_data_fn) { free_data_fn(data); } else if (data) kfree(data); it = q->first; } spin_unlock_bh(&(q->queue_lock)); kfree(q); }