]> git.sur5r.net Git - bacula/bacula/commitdiff
Add wrapper for pthread_kill() to check if thread exists before using kill
authorEric Bollengier <eric@eb.homelinux.org>
Thu, 24 Jun 2010 12:07:56 +0000 (14:07 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 2 Aug 2010 14:53:56 +0000 (16:53 +0200)
You can enable this extra check to be sure that we use pthread_kill()
only with valid pthread id USE_LOCKMGR_SAFEKILL in version.h.

It looks like that some implementation, like the linux one, segfaults
when you are sending a signal to a non existing thread. This problem can
be fixed by using non detached thread, or by checking if the thread is still
present before sending the signal.

bacula/src/lib/lockmgr.c
bacula/src/lib/lockmgr.h

index e95c92c24fc74a61d405833a3e7ec0a14d5dec7a..5e27b224a0ba46d274710ca642ee8241794611bf 100644 (file)
@@ -710,6 +710,40 @@ int pthread_mutex_destroy(bthread_mutex_t *m)
    return pthread_mutex_destroy(&m->mutex);
 }
 
+/* 
+ * Replacement for pthread_kill (only with USE_LOCKMGR_SAFEKILL)
+ */
+int bthread_kill(pthread_t thread, int sig, 
+                 const char *file, int line)
+{
+   bool thread_found_in_process=false;
+   
+   /* We doesn't allow to send signal to ourself */
+   ASSERT(!pthread_equal(thread, pthread_self()));
+
+   /* This loop isn't very efficient with dozens of threads but we don't use
+    * signal very much, and this feature is for testing only
+    */
+   lmgr_p(&lmgr_global_mutex);
+   {
+      lmgr_thread_t *item;
+      foreach_dlist(item, global_mgr) {
+         if (pthread_equal(thread, item->thread_id)) {
+            thread_found_in_process=true;
+            break;
+         }
+      }
+   }
+   lmgr_v(&lmgr_global_mutex);
+
+   /* Sending a signal to non existing thread can create problem
+    * so, we can stop here.
+    */
+   ASSERT(thread_found_in_process == true);
+   
+   return pthread_kill(thread, sig);
+}
+
 /*
  * Replacement for pthread_mutex_lock()
  * Returns always ok 
index a0bd8694929a1500713b3d9b25f4ecc22b733d1e..a7f26e85f424a1d0efe9f05e04b8e087a5427f5f 100644 (file)
@@ -158,6 +158,16 @@ int lmgr_thread_create(pthread_t *thread,
                        const pthread_attr_t *attr,
                        void *(*start_routine)(void*), void *arg);
 
+/* 
+ * Can use SAFEKILL to check if the argument is a valid threadid
+ */
+int bthread_kill(pthread_t thread, int sig, 
+                 const char *file="*unknown*", int line=0);
+
+#ifdef USE_LOCKMGR_SAFEKILL
+# define pthread_kill(a,b)      bthread_kill((a),(b), __FILE__, __LINE__)
+#endif
+
 #define BTHREAD_MUTEX_NO_PRIORITY      {PTHREAD_MUTEX_INITIALIZER, 0}
 #define BTHREAD_MUTEX_INITIALIZER      BTHREAD_MUTEX_NO_PRIORITY