X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fhashtable%2Frculfhash.c;h=423d1865c5e2f84ddac6472a98e2805e91f2bf65;hb=bd845206eabfb048214da2ef76e6c9ecb4b05726;hp=840de351bcf83f616116e4d4b937201505eecd4b;hpb=10a8a2237343699e3923d87e24dbf2d7fe225377;p=lttng-tools.git diff --git a/src/common/hashtable/rculfhash.c b/src/common/hashtable/rculfhash.c index 840de351b..423d1865c 100644 --- a/src/common/hashtable/rculfhash.c +++ b/src/common/hashtable/rculfhash.c @@ -157,7 +157,6 @@ #include #include -#include "config.h" #include #include #include @@ -170,6 +169,15 @@ #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 +1036,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(<tng_libc_state_lock); for (thread = 0; thread < nr_threads; thread++) { work[thread].ht = ht; work[thread].i = i; @@ -1042,6 +1051,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(<tng_libc_state_lock); free(work); }