X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Flib%2Flttng-ust%2Flttng-context-perf-counters.c;h=2db11436a9ad8fa320f7092d9420e21972dc2ad6;hb=362ea43ac96394dc68dc22677cd9b84f5fa29b76;hp=1d44a54ae1e6afd1ecf8f81d896055b8393bec9d;hpb=b2e37d27accf5e32128b82392dbe1a9522c7dc20;p=lttng-ust.git diff --git a/src/lib/lttng-ust/lttng-context-perf-counters.c b/src/lib/lttng-ust/lttng-context-perf-counters.c index 1d44a54a..2db11436 100644 --- a/src/lib/lttng-ust/lttng-context-perf-counters.c +++ b/src/lib/lttng-ust/lttng-context-perf-counters.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -71,18 +72,12 @@ static pthread_key_t perf_counter_key; * lttng_perf_lock - Protect lttng-ust perf counter data structures * * Nests within the ust_lock, and therefore within the libc dl lock. - * Therefore, we need to fixup the TLS before nesting into this lock. + * Therefore, we need to allocate the TLS before nesting into this lock. * Nests inside RCU bp read-side lock. Protects against concurrent * fork. */ static pthread_mutex_t ust_perf_mutex = PTHREAD_MUTEX_INITIALIZER; -/* - * Cancel state when grabbing the ust_perf_mutex. Saved when locking, - * restored on unlock. Protected by ust_perf_mutex. - */ -static int ust_perf_saved_cancelstate; - /* * Track whether we are tracing from a signal handler nested on an * application thread. @@ -90,9 +85,9 @@ static int ust_perf_saved_cancelstate; static DEFINE_URCU_TLS(int, ust_perf_mutex_nest); /* - * Force a read (imply TLS fixup for dlopen) of TLS variables. + * Force a read (imply TLS allocation for dlopen) of TLS variables. */ -void lttng_ust_fixup_perf_counter_tls(void) +void lttng_ust_perf_counter_alloc_tls(void) { asm volatile ("" : : "m" (URCU_TLS(ust_perf_mutex_nest))); } @@ -100,11 +95,10 @@ void lttng_ust_fixup_perf_counter_tls(void) void lttng_perf_lock(void) { sigset_t sig_all_blocked, orig_mask; - int ret, oldstate; + int ret; - ret = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); - if (ret) { - ERR("pthread_setcancelstate: %s", strerror(ret)); + if (lttng_ust_cancelstate_disable_push()) { + ERR("lttng_ust_cancelstate_disable_push"); } sigfillset(&sig_all_blocked); ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_mask); @@ -118,7 +112,6 @@ void lttng_perf_lock(void) */ cmm_barrier(); pthread_mutex_lock(&ust_perf_mutex); - ust_perf_saved_cancelstate = oldstate; } ret = pthread_sigmask(SIG_SETMASK, &orig_mask, NULL); if (ret) { @@ -129,8 +122,7 @@ void lttng_perf_lock(void) void lttng_perf_unlock(void) { sigset_t sig_all_blocked, orig_mask; - int ret, newstate, oldstate; - bool restore_cancel = false; + int ret; sigfillset(&sig_all_blocked); ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_mask); @@ -143,19 +135,14 @@ void lttng_perf_unlock(void) */ cmm_barrier(); if (!--URCU_TLS(ust_perf_mutex_nest)) { - newstate = ust_perf_saved_cancelstate; - restore_cancel = true; pthread_mutex_unlock(&ust_perf_mutex); } ret = pthread_sigmask(SIG_SETMASK, &orig_mask, NULL); if (ret) { ERR("pthread_sigmask: %s", strerror(ret)); } - if (restore_cancel) { - ret = pthread_setcancelstate(newstate, &oldstate); - if (ret) { - ERR("pthread_setcancelstate: %s", strerror(ret)); - } + if (lttng_ust_cancelstate_disable_pop()) { + ERR("lttng_ust_cancelstate_disable_pop"); } }