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 |