Fix: work-around glibc __nptl_setxid vs clone hang
[lttng-tools.git] / src / common / hashtable / rculfhash.c
index 840de351bcf83f616116e4d4b937201505eecd4b..776f9f391fd0e74b2b6fbcaee4fe8bc14fe5d73d 100644 (file)
 #include "rculfhash-internal.h"
 #include "urcu-flavor.h"
 
+/*
+ * We need to lock pthread exit, which deadlocks __nptl_setxid in the
+ * runas clone.
+ * This work-around will be allowed to be removed when runas.c gets
+ * changed to do an exec() before issuing seteuid/setegid.
+ * See http://sourceware.org/bugzilla/show_bug.cgi?id=10184 for details.
+ */
+pthread_mutex_t lttng_libc_state_lock = PTHREAD_MUTEX_INITIALIZER;
+
 /*
  * Split-counters lazily update the global counter each 1024
  * addition/removal. It automatically keeps track of resize required.
@@ -1028,6 +1037,7 @@ void partition_resize_helper(struct cds_lfht *ht, unsigned long i,
        partition_len = len >> cds_lfht_get_count_order_ulong(nr_threads);
        work = calloc(nr_threads, sizeof(*work));
        assert(work);
+       pthread_mutex_lock(&lttng_libc_state_lock);
        for (thread = 0; thread < nr_threads; thread++) {
                work[thread].ht = ht;
                work[thread].i = i;
@@ -1042,6 +1052,7 @@ void partition_resize_helper(struct cds_lfht *ht, unsigned long i,
                ret = pthread_join(work[thread].thread_id, NULL);
                assert(!ret);
        }
+       pthread_mutex_unlock(&lttng_libc_state_lock);
        free(work);
 }
 
This page took 0.023253 seconds and 4 git commands to generate.