Removed MAX_VCORE reference from pthread cond vars
[akaros.git] / user / include / mcs.h
1 #ifndef _MCS_H
2 #define _MCS_H
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8 #include <vcore.h>
9 #include <arch/arch.h>
10
11 #define MCS_LOCK_INIT {0}
12
13 typedef struct mcs_lock_qnode
14 {
15         volatile struct mcs_lock_qnode* volatile next;
16         volatile int locked;
17         char pad[ARCH_CL_SIZE-sizeof(void*)-sizeof(int)];
18 } mcs_lock_qnode_t;
19
20 typedef struct
21 {
22         mcs_lock_qnode_t* lock;
23         char pad[ARCH_CL_SIZE-sizeof(mcs_lock_qnode_t*)];
24         mcs_lock_qnode_t qnode[MAX_VCORES] __attribute__((aligned(8)));
25 } mcs_lock_t;
26
27 typedef struct
28 {
29         volatile int myflags[2][LOG2_MAX_VCORES];
30         volatile int* partnerflags[2][LOG2_MAX_VCORES];
31         int parity;
32         int sense;
33         char pad[ARCH_CL_SIZE];
34 } mcs_dissem_flags_t;
35
36 typedef struct
37 {
38         size_t nprocs;
39         mcs_dissem_flags_t* allnodes;
40         size_t logp;
41 } mcs_barrier_t;
42
43 int mcs_barrier_init(mcs_barrier_t* b, size_t nprocs);
44 void mcs_barrier_wait(mcs_barrier_t* b, size_t vcoreid);
45
46 void mcs_lock_init(mcs_lock_t* lock);
47 void mcs_lock_unlock(mcs_lock_t* lock);
48 void mcs_lock_lock(mcs_lock_t* l);
49
50 #ifdef __cplusplus
51 }
52 #endif
53
54 #endif