926e55179828823a2d5b674ee28bfb8ba6c49f4f
[akaros.git] / user / parlib / include / waitfreelist.h
1 /* Copyright (c) 2014 The Regents of the University of California
2  * Kevin Klues <klueska@cs.berkeley.edu>
3  * Andrew Waterman <waterman@cs.berkeley.edu>
4  * See LICENSE for details.
5  *
6  * A wait-free unordered list data structure.
7  * 
8  */
9
10 #ifndef _PARLIB_WAITFREELIST_H
11 #define _PARLIB_WAITFREELIST_H
12
13 #include <string.h>
14
15 struct wfl_entry {
16   struct wfl_entry *next;
17   void *data;
18 };
19
20 struct wfl {
21   struct wfl_entry *head;
22   struct wfl_entry first;
23 };
24
25 #define WFL_INITIALIZER(list) {&(list).first, {0, 0}}
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 void wfl_init(struct wfl *list);
32 void wfl_destroy(struct wfl *list);
33 size_t wfl_capacity(struct wfl *list);
34 size_t wfl_size(struct wfl *list);
35 void wfl_insert(struct wfl *list, void *data);
36 void *wfl_remove(struct wfl *list);
37 size_t wfl_remove_all(struct wfl *list, void *data);
38
39 /* Iterate over list.  Safe w.r.t. inserts, but not w.r.t. removals. */
40 #define wfl_foreach_unsafe(elm, list) \
41   for (struct wfl_entry *_p = (list)->head; \
42        elm = _p == NULL ? NULL : _p->data, _p != NULL; \
43        _p = _p->next) \
44     if (elm)
45
46 #ifdef __cplusplus
47 }
48 #endif
49
50 #endif