X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fhashtable%2Frculfhash.c;h=776f9f391fd0e74b2b6fbcaee4fe8bc14fe5d73d;hb=9ef70f8738b524b8ea4f266c526de9d5a4fdc29c;hp=840de351bcf83f616116e4d4b937201505eecd4b;hpb=509bb1cf6c7fc3de758b0a58d3610a653235788b;p=lttng-tools.git diff --git a/src/common/hashtable/rculfhash.c b/src/common/hashtable/rculfhash.c index 840de351b..776f9f391 100644 --- a/src/common/hashtable/rculfhash.c +++ b/src/common/hashtable/rculfhash.c @@ -170,6 +170,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 +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(<tng_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(<tng_libc_state_lock); free(work); }