blob: 27d9a6084361e725f2cdf64b6669590c83e86f6a [file] [log] [blame]
/* Copyright (c) 2014 The Regents of the University of California
* Kevin Klues <klueska@cs.berkeley.edu>
* Andrew Waterman <waterman@cs.berkeley.edu>
* See LICENSE for details.
*
* A wait-free unordered list data structure.
*
*/
#pragma once
#include <string.h>
__BEGIN_DECLS
struct wfl_entry {
struct wfl_entry *next;
void *data;
};
struct wfl {
struct wfl_entry *head;
struct wfl_entry first;
};
#define WFL_INITIALIZER(list) {&(list).first, {0, 0}}
void wfl_init(struct wfl *list);
void wfl_destroy(struct wfl *list);
size_t wfl_capacity(struct wfl *list);
size_t wfl_size(struct wfl *list);
void wfl_insert(struct wfl *list, void *data);
void *wfl_remove(struct wfl *list);
size_t wfl_remove_all(struct wfl *list, void *data);
/* Iterate over list. Safe w.r.t. inserts, but not w.r.t. removals. */
#define wfl_foreach_unsafe(elm, list) \
for (struct wfl_entry *_p = (list)->head; \
elm = _p == NULL ? NULL : _p->data, _p != NULL; \
_p = _p->next) \
if (elm)
__END_DECLS