init version
[urcu.git] / urcu.h
CommitLineData
27b012e2
MD
1#ifndef _URCU_H
2#define _URCU_H
3
4/* The "volatile" is due to gcc bugs */
5#define barrier() __asm__ __volatile__("": : :"memory")
6
7/* x86 32/64 specific */
8#define mb() asm volatile("mfence":::"memory")
9#define rmb() asm volatile("lfence":::"memory")
10#define wmb() asm volatile("sfence" ::: "memory")
11
12
13
14/* x86 32 */
15static inline void atomic_inc(int *v)
16{
17 asm volatile("lock; incl %0"
18 : "+m" (v->counter));
19}
20
21/* Nop everywhere except on alpha. */
22#define smp_read_barrier_depends()
23
24#define SIGURCU SIGUSR1
25
26/* Global quiescent period parity */
27extern int urcu_qparity;
28
29extern int __thread urcu_active_readers[2];
30
31static inline int get_urcu_qparity(void)
32{
33 return urcu_qparity;
34}
35
36/*
37 * returns urcu_parity.
38 */
39static inline int rcu_read_lock(void)
40{
41 int urcu_parity = get_urcu_qparity();
42 urcu_active_readers[urcu_parity]++;
43 /*
44 * Increment active readers count before accessing the pointer.
45 * See force_mb_all_threads().
46 */
47 barrier();
48 return urcu_parity;
49}
50
51static inline void rcu_read_unlock(int urcu_parity)
52{
53 barrier();
54 /*
55 * Finish using rcu before decrementing the pointer.
56 * See force_mb_all_threads().
57 */
58 urcu_active_readers[urcu_parity]--;
59}
60
61extern void *urcu_publish_content(void **ptr, void *new);
62
63/*
64 * Reader thread registration.
65 */
66extern void urcu_register_thread(void);
67extern void urcu_register_thread(void);
68
69#endif /* _URCU_H */
This page took 0.032426 seconds and 4 git commands to generate.