Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2399 → Rev 2400

/branches/rcu/kernel/generic/include/synch/rcu.h
61,16 → 61,23
#define rcu_assign_pointer(p, newp) {write_barrier(); (p)=(newp);}
 
/** RCU sync callback for those who don't need custom allocation */
#define rcu_sync_callback(func, data) {\
#define rcu_sync_callback_normal_alloc(func, data) {\
rcu_callback_list_t* rd = malloc(sizeof(rcu_callback_list_t),0);\
rcu_sync_callback_custom_alloc(func, data, rd);}
rcu_sync_callback(func, data, rd);}
 
/** RCU sync callback without custom allocation, default callback (just frees the argument) */
#define rcu_sync_callback_normal_alloc_free(data) rcu_sync_callback_normal_alloc(&rcu_callback_free, data)
 
void rcu_init(void);
void rcu_synchronize(void);
void rcu_synchronize_callback_function(void* waitq);
void rcu_sync_callback_custom_alloc(void (*func)(void* data), void* data, rcu_callback_list_t* rcu_struct);
void rcu_sync_callback(void (*func)(void* data), void* data, rcu_callback_list_t* rcu_struct);
void rcu_tasklet(void* data);
void rcu_passQS(void);
void rcu_run_callbacks(void);
void rcu_callback_free(void* pointer);
 
 
 
 
#endif
/branches/rcu/kernel/generic/src/synch/rcu.c
101,7 → 101,7
#ifdef CONFIG_SMP
waitq_t wq;
waitq_initialize(&wq);
rcu_sync_callback(&rcu_synchronize_callback_function, &wq);
rcu_sync_callback_normal_alloc(&rcu_synchronize_callback_function, &wq);
//sleep until the end of the grace period
waitq_sleep(&wq);
#endif
123,7 → 123,7
* is handled in rcu_run_callbacks and in the tasklet. This is a lock free variant,
* which must be supplied with a preallocated rcu_callback_list_t structure
*/
void rcu_sync_callback_custom_alloc(void (*func)(void* data), void* data, rcu_callback_list_t* rd)
void rcu_sync_callback(void (*func)(void* data), void* data, rcu_callback_list_t* rd)
{
#ifndef CONFIG_SMP
func(data);
240,3 → 240,12
}
 
 
/**
* Generic callback for RCU, frees @paramref pointer
* @param pointer
*/
void rcu_callback_free(void* pointer)
{
free(pointer);
}