Set the glibc thread's pointer_guard (XCC)
[akaros.git] / user / parlib / evbitmap.c
1 /* Copyright (c) 2015 Google Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Event bitmaps.  These are a type of event mailbox where the message type is
6  * translated to a bit, which is set in the bitmap. */
7
8 #include <parlib/evbitmap.h>
9 #include <parlib/bitmask.h>
10 #include <string.h>
11
12 void evbitmap_init(struct evbitmap *evbm)
13 {
14         memset(evbm, 0, sizeof(struct evbitmap));
15 }
16
17 void evbitmap_cleanup(struct evbitmap *evbm)
18 {
19 }
20
21 bool evbitmap_is_empty(struct evbitmap *evbm)
22 {
23         return !evbm->check_bits;
24 }
25
26 bool get_evbitmap_msg(struct evbitmap *evbm, struct event_msg *ev_msg)
27 {
28         if (evbitmap_is_empty(evbm))
29                 return FALSE;
30         while (1) {
31                 for (int i = 0; i < MAX_NR_EVENT; i++) {
32                         if (GET_BITMASK_BIT(evbm->bitmap, i)) {
33                                 CLR_BITMASK_BIT_ATOMIC(evbm->bitmap, i);
34                                 /* bit messages are empty except for the type. */
35                                 memset(ev_msg, 0, sizeof(struct event_msg));
36                                 ev_msg->ev_type = i;
37                                 return TRUE;
38                         }
39                 }
40                 /* If we made it here, then the bitmap might be empty. */
41                 evbm->check_bits = FALSE;
42                 wrmb(); /* check_bits written before we check for it being clear */
43                 if (BITMASK_IS_CLEAR(evbm->bitmap, MAX_NR_EVENT))
44                         return FALSE;
45                 cmb();
46                 evbm->check_bits = TRUE;
47         }
48 }