Version 0.7.5
[userspace-rcu.git] / urcu-call-rcu-impl.h
index 8ed2ab384f81c0806d7c40a74430eb527ad825de..b205229bcc4ceb7797e2ae438fc19adc458b8d20 100644 (file)
@@ -41,6 +41,7 @@
 #include "urcu/list.h"
 #include "urcu/futex.h"
 #include "urcu/tls-compat.h"
+#include "urcu-die.h"
 
 /* Data structure that identifies a call_rcu thread. */
 
@@ -151,20 +152,22 @@ static int sched_getcpu(void)
 
 static void call_rcu_lock(pthread_mutex_t *pmp)
 {
-       if (pthread_mutex_lock(pmp) != 0) {
-               perror("pthread_mutex_lock");
-               exit(-1);
-       }
+       int ret;
+
+       ret = pthread_mutex_lock(pmp);
+       if (ret)
+               urcu_die(ret);
 }
 
 /* Release the specified pthread mutex. */
 
 static void call_rcu_unlock(pthread_mutex_t *pmp)
 {
-       if (pthread_mutex_unlock(pmp) != 0) {
-               perror("pthread_mutex_unlock");
-               exit(-1);
-       }
+       int ret;
+
+       ret = pthread_mutex_unlock(pmp);
+       if (ret)
+               urcu_die(ret);
 }
 
 #if HAVE_SCHED_SETAFFINITY
@@ -222,11 +225,11 @@ static void *call_rcu_thread(void *arg)
        struct call_rcu_data *crdp = (struct call_rcu_data *)arg;
        struct rcu_head *rhp;
        int rt = !!(uatomic_read(&crdp->flags) & URCU_CALL_RCU_RT);
+       int ret;
 
-       if (set_thread_cpu_affinity(crdp) != 0) {
-               perror("pthread_setaffinity_np");
-               exit(-1);
-       }
+       ret = set_thread_cpu_affinity(crdp);
+       if (ret)
+               urcu_die(errno);
 
        /*
         * If callbacks take a read-side lock, we need to be registered.
@@ -308,12 +311,11 @@ static void call_rcu_data_init(struct call_rcu_data **crdpp,
                               int cpu_affinity)
 {
        struct call_rcu_data *crdp;
+       int ret;
 
        crdp = malloc(sizeof(*crdp));
-       if (crdp == NULL) {
-               fprintf(stderr, "Out of memory.\n");
-               exit(-1);
-       }
+       if (crdp == NULL)
+               urcu_die(errno);
        memset(crdp, '\0', sizeof(*crdp));
        cds_wfq_init(&crdp->cbs);
        crdp->qlen = 0;
@@ -323,10 +325,9 @@ static void call_rcu_data_init(struct call_rcu_data **crdpp,
        crdp->cpu_affinity = cpu_affinity;
        cmm_smp_mb();  /* Structure initialized before pointer is planted. */
        *crdpp = crdp;
-       if (pthread_create(&crdp->tid, NULL, call_rcu_thread, crdp) != 0) {
-               perror("pthread_create");
-               exit(-1);
-       }
+       ret = pthread_create(&crdp->tid, NULL, call_rcu_thread, crdp);
+       if (ret)
+               urcu_die(ret);
 }
 
 /*
@@ -646,8 +647,9 @@ void call_rcu_data_free(struct call_rcu_data *crdp)
                /* Create default call rcu data if need be */
                (void) get_default_call_rcu_data();
                cbs_endprev = (struct cds_wfq_node **)
-                       uatomic_xchg(&default_call_rcu_data, cbs_tail);
-               *cbs_endprev = cbs;
+                       uatomic_xchg(&default_call_rcu_data->cbs.tail,
+                                       cbs_tail);
+               _CMM_STORE_SHARED(*cbs_endprev, cbs);
                uatomic_add(&default_call_rcu_data->qlen,
                            uatomic_read(&crdp->qlen));
                wake_call_rcu_thread(default_call_rcu_data);
This page took 0.022987 seconds and 4 git commands to generate.