|  | /* 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 |