1 #include <linux/rcupdate.h>
6 static pthread_mutex_t rculock = PTHREAD_MUTEX_INITIALIZER;
7 static struct rcu_head *rcuhead_global = NULL;
8 static __thread int nr_rcuhead = 0;
9 static __thread struct rcu_head *rcuhead = NULL;
10 static __thread struct rcu_head *rcutail = NULL;
12 static pthread_cond_t rcu_worker_cond = PTHREAD_COND_INITIALIZER;
14 /* switch to urcu implementation when it is merged. */
15 void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *head))
23 if (nr_rcuhead >= 1000) {
26 pthread_mutex_lock(&rculock);
29 rcutail->next = rcuhead_global;
30 rcuhead_global = head;
31 pthread_mutex_unlock(&rculock);
38 pthread_cond_signal(&rcu_worker_cond);
43 static void *rcu_worker(void *arg)
47 rcupdate_thread_init();
50 pthread_mutex_lock(&rculock);
51 while (!rcuhead_global) {
52 pthread_cond_wait(&rcu_worker_cond, &rculock);
55 rcuhead_global = NULL;
57 pthread_mutex_unlock(&rculock);
62 struct rcu_head *tmp = r->next;
68 rcupdate_thread_exit();
73 static pthread_t worker_thread;
74 void rcupdate_init(void)
76 pthread_create(&worker_thread, NULL, rcu_worker, NULL);
79 void rcupdate_thread_init(void)
81 rcu_register_thread();
83 void rcupdate_thread_exit(void)
85 rcu_unregister_thread();