Fix inappropriate lib behavior: don't call exit()
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 22 Jun 2012 16:48:14 +0000 (12:48 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 22 Jun 2012 16:48:14 +0000 (12:48 -0400)
Use abort() (implemented through the new urcu_die()) instead of exit(-1)
for unrecoverable errors.

Fixes #152

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Makefile.am
urcu-bp.c
urcu-call-rcu-impl.h
urcu-defer-impl.h
urcu-die.h [new file with mode: 0644]
urcu-qsbr.c
urcu.c

index 933e538b6e7516c124967bcab3d64653be723b80..2396fcf1b149894f0fc5172bbbd3353197d80965 100644 (file)
@@ -22,6 +22,8 @@ nobase_dist_include_HEADERS = urcu/compiler.h urcu/hlist.h urcu/list.h \
                urcu/tls-compat.h
 nobase_nodist_include_HEADERS = urcu/arch.h urcu/uatomic.h urcu/config.h
 
+dist_noinst_HEADERS = urcu-die.h
+
 EXTRA_DIST = $(top_srcdir)/urcu/arch/*.h $(top_srcdir)/urcu/uatomic/*.h \
                gpl-2.0.txt lgpl-2.1.txt lgpl-relicensing.txt \
                LICENSE compat_arch_x86.c \
index 67eae07b6e1b3f69c9cc4739d524dd45de899daf..b9c89d899ea0d744246aa369d8417d8b5a1c4cec 100644 (file)
--- a/urcu-bp.c
+++ b/urcu-bp.c
@@ -42,6 +42,8 @@
 #include "urcu-pointer.h"
 #include "urcu/tls-compat.h"
 
+#include "urcu-die.h"
+
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
 #undef _LGPL_SOURCE
 #include "urcu-bp.h"
@@ -142,17 +144,12 @@ static void mutex_lock(pthread_mutex_t *mutex)
 
 #ifndef DISTRUST_SIGNALS_EXTREME
        ret = pthread_mutex_lock(mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(ret);
 #else /* #ifndef DISTRUST_SIGNALS_EXTREME */
        while ((ret = pthread_mutex_trylock(mutex)) != 0) {
-               if (ret != EBUSY && ret != EINTR) {
-                       printf("ret = %d, errno = %d\n", ret, errno);
-                       perror("Error in pthread mutex lock");
-                       exit(-1);
-               }
+               if (ret != EBUSY && ret != EINTR)
+                       urcu_die(ret);
                poll(NULL,0,10);
        }
 #endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
@@ -163,10 +160,8 @@ static void mutex_unlock(pthread_mutex_t *mutex)
        int ret;
 
        ret = pthread_mutex_unlock(mutex);
-       if (ret) {
-               perror("Error in pthread mutex unlock");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(ret);
 }
 
 void update_counter_and_wait(void)
index 8ed2ab384f81c0806d7c40a74430eb527ad825de..13b24ff20b7c71c265c1fc5b0b3d17f1c28ce55c 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);
 }
 
 /*
index f65e41086022f2613bdaf251611a378afb6e5a3d..a7d0b2f7c45aa0a1054d70aac989293b63c87466 100644 (file)
@@ -49,6 +49,7 @@
 #include <urcu/list.h>
 #include <urcu/system.h>
 #include <urcu/tls-compat.h>
+#include "urcu-die.h"
 
 /*
  * Number of entries in the per-thread defer queue. Must be power of 2.
@@ -141,17 +142,12 @@ static void mutex_lock_defer(pthread_mutex_t *mutex)
 
 #ifndef DISTRUST_SIGNALS_EXTREME
        ret = pthread_mutex_lock(mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(ret);
 #else /* #ifndef DISTRUST_SIGNALS_EXTREME */
        while ((ret = pthread_mutex_trylock(mutex)) != 0) {
-               if (ret != EBUSY && ret != EINTR) {
-                       printf("ret = %d, errno = %d\n", ret, errno);
-                       perror("Error in pthread mutex lock");
-                       exit(-1);
-               }
+               if (ret != EBUSY && ret != EINTR)
+                       urcu_die(ret);
                poll(NULL,0,10);
        }
 #endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
diff --git a/urcu-die.h b/urcu-die.h
new file mode 100644 (file)
index 0000000..227c8dc
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _URCU_DIE_H
+#define _URCU_DIE_H
+
+/*
+ * urcu-die.h
+ *
+ * Userspace RCU library unrecoverable error handling
+ *
+ * Copyright (c) 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define urcu_die(cause)                                                                \
+do {                                                                           \
+       fprintf(stderr, "(" __FILE__ ":%s@%u) Unrecoverable error: %s\n",       \
+               __func__, __LINE__, strerror(cause));                           \
+       abort();                                                                \
+} while (0)
+
+#endif /* _URCU_DIE_H */
index b20d564c5f6799f3ac42d5e53fe4fc331a322cf7..d3a6849ac04901097783fd0810b7a4aba4bf792c 100644 (file)
@@ -42,6 +42,8 @@
 #include "urcu-pointer.h"
 #include "urcu/tls-compat.h"
 
+#include "urcu-die.h"
+
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
 #undef _LGPL_SOURCE
 #include "urcu-qsbr.h"
@@ -82,17 +84,12 @@ static void mutex_lock(pthread_mutex_t *mutex)
 
 #ifndef DISTRUST_SIGNALS_EXTREME
        ret = pthread_mutex_lock(mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(ret);
 #else /* #ifndef DISTRUST_SIGNALS_EXTREME */
        while ((ret = pthread_mutex_trylock(mutex)) != 0) {
-               if (ret != EBUSY && ret != EINTR) {
-                       printf("ret = %d, errno = %d\n", ret, errno);
-                       perror("Error in pthread mutex lock");
-                       exit(-1);
-               }
+               if (ret != EBUSY && ret != EINTR)
+                       urcu_die(ret);
                poll(NULL,0,10);
        }
 #endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
@@ -103,10 +100,8 @@ static void mutex_unlock(pthread_mutex_t *mutex)
        int ret;
 
        ret = pthread_mutex_unlock(mutex);
-       if (ret) {
-               perror("Error in pthread mutex unlock");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(ret);
 }
 
 /*
diff --git a/urcu.c b/urcu.c
index 5fb4db8229eb2f8c4ac4893d9684d1401ed6e42b..a5178c0054bea5f0363b571d542b98b4d6803f9e 100644 (file)
--- a/urcu.c
+++ b/urcu.c
@@ -42,6 +42,8 @@
 #include "urcu-pointer.h"
 #include "urcu/tls-compat.h"
 
+#include "urcu-die.h"
+
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
 #undef _LGPL_SOURCE
 #include "urcu.h"
@@ -110,17 +112,12 @@ static void mutex_lock(pthread_mutex_t *mutex)
 
 #ifndef DISTRUST_SIGNALS_EXTREME
        ret = pthread_mutex_lock(mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(ret);
 #else /* #ifndef DISTRUST_SIGNALS_EXTREME */
        while ((ret = pthread_mutex_trylock(mutex)) != 0) {
-               if (ret != EBUSY && ret != EINTR) {
-                       printf("ret = %d, errno = %d\n", ret, errno);
-                       perror("Error in pthread mutex lock");
-                       exit(-1);
-               }
+               if (ret != EBUSY && ret != EINTR)
+                       urcu_die(ret);
                if (CMM_LOAD_SHARED(URCU_TLS(rcu_reader).need_mb)) {
                        cmm_smp_mb();
                        _CMM_STORE_SHARED(URCU_TLS(rcu_reader).need_mb, 0);
@@ -136,10 +133,8 @@ static void mutex_unlock(pthread_mutex_t *mutex)
        int ret;
 
        ret = pthread_mutex_unlock(mutex);
-       if (ret) {
-               perror("Error in pthread mutex unlock");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(ret);
 }
 
 #ifdef RCU_MEMBARRIER
@@ -432,10 +427,8 @@ void rcu_init(void)
        act.sa_flags = SA_SIGINFO | SA_RESTART;
        sigemptyset(&act.sa_mask);
        ret = sigaction(SIGRCU, &act, NULL);
-       if (ret) {
-               perror("Error in sigaction");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(errno);
 }
 
 void rcu_exit(void)
@@ -444,10 +437,8 @@ void rcu_exit(void)
        int ret;
 
        ret = sigaction(SIGRCU, NULL, &act);
-       if (ret) {
-               perror("Error in sigaction");
-               exit(-1);
-       }
+       if (ret)
+               urcu_die(errno);
        assert(act.sa_sigaction == sigrcu_handler);
        assert(cds_list_empty(&registry));
 }
This page took 0.031749 seconds and 4 git commands to generate.