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