Rev 2309 | Rev 2400 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2309 | Rev 2330 | ||
---|---|---|---|
Line 39... | Line 39... | ||
39 | #include <proc/tasklet.h> |
39 | #include <proc/tasklet.h> |
40 | #include <arch/barrier.h> |
40 | #include <arch/barrier.h> |
41 | #include <arch.h> |
41 | #include <arch.h> |
42 | #include <preemption.h> |
42 | #include <preemption.h> |
43 | 43 | ||
- | 44 | typedef struct rcu_callback_list { |
|
- | 45 | struct rcu_callback_list* next; |
|
- | 46 | void (*func)(void*); |
|
- | 47 | void* data; |
|
- | 48 | } rcu_callback_list_t; |
|
- | 49 | ||
44 | 50 | ||
45 | /** Read lock for RCU protected pointer */ |
51 | /** Read lock for RCU protected pointer */ |
46 | #define rcu_read_lock() preemption_disable() |
52 | #define rcu_read_lock() preemption_disable() |
47 | 53 | ||
48 | /** Release of read lock for RCU protected pointer */ |
54 | /** Release of read lock for RCU protected pointer */ |
Line 52... | Line 58... | ||
52 | #define rcu_dereference_pointer(p) (*(p)) |
58 | #define rcu_dereference_pointer(p) (*(p)) |
53 | 59 | ||
54 | /** Assigning a value to an RCU protected pointer */ |
60 | /** Assigning a value to an RCU protected pointer */ |
55 | #define rcu_assign_pointer(p, newp) {write_barrier(); (p)=(newp);} |
61 | #define rcu_assign_pointer(p, newp) {write_barrier(); (p)=(newp);} |
56 | 62 | ||
- | 63 | /** RCU sync callback for those who don't need custom allocation */ |
|
- | 64 | #define rcu_sync_callback(func, data) {\ |
|
- | 65 | rcu_callback_list_t* rd = malloc(sizeof(rcu_callback_list_t),0);\ |
|
- | 66 | rcu_sync_callback_custom_alloc(func, data, rd);} |
|
- | 67 | ||
57 | void rcu_init(void); |
68 | void rcu_init(void); |
58 | void rcu_synchronize(void); |
69 | void rcu_synchronize(void); |
59 | void rcu_synchronize_callback_function(void* waitq); |
70 | void rcu_synchronize_callback_function(void* waitq); |
60 | void rcu_sync_callback(void (*func)(void* data), void* data); |
71 | void rcu_sync_callback_custom_alloc(void (*func)(void* data), void* data, rcu_callback_list_t* rcu_struct); |
61 | void rcu_tasklet(void* data); |
72 | void rcu_tasklet(void* data); |
62 | inline void rcu_passQS(void); |
73 | void rcu_passQS(void); |
63 | void rcu_run_callbacks(void); |
74 | void rcu_run_callbacks(void); |
64 | 75 | ||
65 | #endif |
76 | #endif |