Fix potential overflow error in CEQs (XCC)
[akaros.git] / user / parlib / include / parlib / ceq.h
1 /* Copyright (c) 2015 Google Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Coalescing Event Queue: encapuslates the essence of epoll/kqueue in shared
6  * memory: a dense array of sticky status bits.
7  *
8  * User side (consumer).
9  *
10  * When initializing, the nr_events is the maximum count of events you are
11  * tracking, e.g. 100 FDs being tapped, but not the actual FD numbers.
12  *
13  * The ring_sz is a rough guess of the number of concurrent events.  It's not a
14  * big deal what you pick, but it must be a power of 2.  Otherwise the kernel
15  * will probably scribble over your memory.  If you pick a value that is too
16  * small, then the ring may overflow, triggering an O(n) scan of the events
17  * array.  You could make it == nr_events, for reasonable behavior at the
18  * expense of memory. */
19
20 #pragma once
21
22 #include <ros/ceq.h>
23 #include <ros/event.h>
24
25 __BEGIN_DECLS
26
27 /* If you get a non-raw event queue (with mbox, initialized by event code), then
28  * you'll get a CEQ with 128 events and 128 ring slots with the OR operation.
29  * It's actually doable to have the user grow the CEQ, but we don't have support
30  * for that yet, so just pick a size in advance.  If you're using a CEQ, you'll
31  * probably want to do it yourself. */
32 #define CEQ_DEFAULT_SZ 128
33
34 void ceq_init(struct ceq *ceq, uint8_t op, unsigned int nr_events,
35               size_t ring_sz);
36 bool get_ceq_msg(struct ceq *ceq, struct event_msg *msg);
37 bool ceq_is_empty(struct ceq *ceq);
38 void ceq_cleanup(struct ceq *ceq);
39
40 __END_DECLS