blob: 69ea7b80757dac5c15c04c2b57952551e0186234 [file] [log] [blame]
/* Copyright (c) 2015 Google Inc.
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* Event bitmaps. These are a type of event mailbox where the message type is
* translated to a bit, which is set in the bitmap. */
#include <parlib/evbitmap.h>
#include <parlib/bitmask.h>
#include <string.h>
void evbitmap_init(struct evbitmap *evbm)
{
memset(evbm, 0, sizeof(struct evbitmap));
}
void evbitmap_cleanup(struct evbitmap *evbm)
{
}
bool evbitmap_is_empty(struct evbitmap *evbm)
{
return !evbm->check_bits;
}
bool get_evbitmap_msg(struct evbitmap *evbm, struct event_msg *ev_msg)
{
if (evbitmap_is_empty(evbm))
return FALSE;
while (1) {
for (int i = 0; i < MAX_NR_EVENT; i++) {
if (GET_BITMASK_BIT(evbm->bitmap, i)) {
CLR_BITMASK_BIT_ATOMIC(evbm->bitmap, i);
/* bit messages are empty except for the type */
memset(ev_msg, 0, sizeof(struct event_msg));
ev_msg->ev_type = i;
return TRUE;
}
}
/* If we made it here, then the bitmap might be empty. */
evbm->check_bits = FALSE;
/* check_bits written before we check for it being clear */
wrmb();
if (BITMASK_IS_CLEAR(evbm->bitmap, MAX_NR_EVENT))
return FALSE;
cmb();
evbm->check_bits = TRUE;
}
}