X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu-call-rcu.h;h=98807ea134f8e177bf2e3d432ace5f6a0f98a367;hp=e76a844018f2e24a129ab1e3db957ec90f6cdf40;hb=b0a841b4ff807dd29fe0cdbfe24900312f0e627b;hpb=c1d2c60b1c754815d27f29705d5f2077c0900148 diff --git a/urcu-call-rcu.h b/urcu-call-rcu.h index e76a844..98807ea 100644 --- a/urcu-call-rcu.h +++ b/urcu-call-rcu.h @@ -32,7 +32,7 @@ #include #include -#include +#include #ifdef __cplusplus extern "C" { @@ -44,10 +44,12 @@ struct call_rcu_data; /* Flag values. */ -#define URCU_CALL_RCU_RT 0x1 -#define URCU_CALL_RCU_RUNNING 0x2 -#define URCU_CALL_RCU_STOP 0x4 -#define URCU_CALL_RCU_STOPPED 0x8 +#define URCU_CALL_RCU_RT (1U << 0) +#define URCU_CALL_RCU_RUNNING (1U << 1) +#define URCU_CALL_RCU_STOP (1U << 2) +#define URCU_CALL_RCU_STOPPED (1U << 3) +#define URCU_CALL_RCU_PAUSE (1U << 4) +#define URCU_CALL_RCU_PAUSED (1U << 5) /* * The rcu_head data structure is placed in the structure to be freed @@ -55,29 +57,43 @@ struct call_rcu_data; */ struct rcu_head { - struct cds_wfq_node next; + struct cds_wfcq_node next; void (*func)(struct rcu_head *head); }; /* * Exported functions + * + * Important: see rcu-api.md in userspace-rcu documentation for + * call_rcu family of functions usage detail, including the surrounding + * RCU usage required when using these primitives. */ -struct call_rcu_data *get_cpu_call_rcu_data(int cpu); -pthread_t get_call_rcu_thread(struct call_rcu_data *crdp); + +void call_rcu(struct rcu_head *head, + void (*func)(struct rcu_head *head)); + struct call_rcu_data *create_call_rcu_data(unsigned long flags, int cpu_affinity); -int set_cpu_call_rcu_data(int cpu, struct call_rcu_data *crdp); +void call_rcu_data_free(struct call_rcu_data *crdp); + struct call_rcu_data *get_default_call_rcu_data(void); -struct call_rcu_data *get_call_rcu_data(void); +struct call_rcu_data *get_cpu_call_rcu_data(int cpu); struct call_rcu_data *get_thread_call_rcu_data(void); +struct call_rcu_data *get_call_rcu_data(void); +pthread_t get_call_rcu_thread(struct call_rcu_data *crdp); + void set_thread_call_rcu_data(struct call_rcu_data *crdp); +int set_cpu_call_rcu_data(int cpu, struct call_rcu_data *crdp); + int create_all_cpu_call_rcu_data(unsigned long flags); -void call_rcu(struct rcu_head *head, - void (*func)(struct rcu_head *head)); -void call_rcu_data_free(struct call_rcu_data *crdp); void free_all_cpu_call_rcu_data(void); + +void call_rcu_before_fork(void); +void call_rcu_after_fork_parent(void); void call_rcu_after_fork_child(void); +void rcu_barrier(void); + #ifdef __cplusplus } #endif