Barret pointed out that the inclusion of regions was a mistake.
[akaros.git] / kern / include / smallidpool.h
1 /* Copyright (c) 2015 Google Inc.
2  * Ron Minnich <rminnich@google.com>
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  *
5  * Trivial thread-safe ID pool for small sets of things (< 64K)
6  * implemented as a stack.
7  */
8
9 #ifndef ROS_KERN_SMALLIDPOOL_H
10 #define ROS_KERN_SMALLIDPOOL_H
11
12 #define MAX_U16_POOL_SZ (1 << 16)
13
14 #include <atomic.h>
15
16 /* IDS is the stack of 16 bit integers we give out.  TOS is the top of stack -
17  * it is the index of the next slot that can be popped, if there are any.  It's
18  * a u32 so it can be greater than a u16.
19  *
20  * All free slots in ids will be below the TOS, ranging from indexes [0, TOS),
21  * where if TOS == 0, then there are no free slots to push.
22  *
23  * We can hand out u16s in the range [0, 65535].
24  *
25  * The check array is used instead of a bitfield because these architectures
26  * suck at those. */
27
28 struct u16_pool {
29         spinlock_t lock;
30         uint32_t tos;
31         uint16_t *ids;
32         uint8_t *check;
33         int size;
34 };
35
36 struct u16_pool *create_u16_pool(unsigned int size);
37 int get_u16(struct u16_pool *id);
38 void put_u16(struct u16_pool *id, int v);
39
40 #endif /* ROS_KERN_SMALLIDPOOL_H */