File mode stored in i_mode
[akaros.git] / kern / include / ros / atomic.h
1 /* Copyright (c) 2010 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Locking and atomics that are part of the kernel interface. */
6
7 #ifndef ROS_INC_ATOMIC_H
8 #define ROS_INC_ATOMIC_H
9
10 #include <ros/common.h>
11
12 /* The seq counters are used by userspace to see if the kernel is updating
13  * something or if something is valid, such as the vcore->pcore mapping.  The
14  * way a reader can tell nothing has changed is to read the counter before and
15  * after.  If the value has changed, the reader needs to re-read.  If the value
16  * is odd, a write is in progress or it is otherwise invalid/locked. */
17
18 typedef uint8_t seq_ctr_t;
19 #define SEQCTR_INITIALIZER 0
20
21 static inline bool seq_is_locked(seq_ctr_t seq_ctr);
22 static inline bool seqctr_retry(seq_ctr_t old_ctr, seq_ctr_t new_ctr);
23
24 /* Basic helpers for readers.  Ex:
25  * do {
26  *              seq_ctr_t seq = kernel_maintained_seq_ctr
27  *              read_data_whatever();
28  * } while (seqctr_retry(seq, kernel_maintained_seq_ctr);
29  */
30 static inline bool seq_is_locked(seq_ctr_t seq_ctr)
31 {
32         return seq_ctr % 2;
33 }
34
35 static inline bool seqctr_retry(seq_ctr_t old_ctr, seq_ctr_t new_ctr)
36 {
37         return (seq_is_locked(old_ctr)) || (old_ctr != new_ctr);        
38 }
39
40 #endif /* !ROS_INC_ATOMIC_H */