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();