Bug #1201 » fix-1201-1.diff
| liblttng-ust-comm/lttng-ust-fd-tracker.c | ||
|---|---|---|
|
* nesting into this lock.
|
||
|
*/
|
||
|
static pthread_mutex_t ust_safe_guard_fd_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||
|
/*
|
||
|
* Cancel state when grabbing the ust_safe_guard_fd_mutex. Saved when
|
||
|
* locking, restored on unlock. Protected by ust_safe_guard_fd_mutex.
|
||
|
*/
|
||
|
static int ust_safe_guard_saved_cancelstate;
|
||
|
/*
|
||
|
* Track whether we are within lttng-ust or application, for close
|
||
|
* system call override by LD_PRELOAD library.
|
||
| ... | ... | |
|
void lttng_ust_lock_fd_tracker(void)
|
||
|
{
|
||
|
int ret, oldstate;
|
||
|
ret = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
|
||
|
if (ret) {
|
||
|
ERR("pthread_setcancelstate: %s", strerror(ret));
|
||
|
}
|
||
|
URCU_TLS(thread_fd_tracking) = 1;
|
||
|
/*
|
||
|
* Ensure the compiler don't move the store after the close()
|
||
| ... | ... | |
|
*/
|
||
|
cmm_barrier();
|
||
|
pthread_mutex_lock(&ust_safe_guard_fd_mutex);
|
||
|
ust_safe_guard_saved_cancelstate = oldstate;
|
||
|
}
|
||
|
void lttng_ust_unlock_fd_tracker(void)
|
||
|
{
|
||
|
int ret, newstate, oldstate;
|
||
|
newstate = ust_safe_guard_saved_cancelstate;
|
||
|
pthread_mutex_unlock(&ust_safe_guard_fd_mutex);
|
||
|
/*
|
||
|
* Ensure the compiler don't move the store before the close()
|
||
| ... | ... | |
|
*/
|
||
|
cmm_barrier();
|
||
|
URCU_TLS(thread_fd_tracking) = 0;
|
||
|
ret = pthread_setcancelstate(newstate, &oldstate);
|
||
|
if (ret) {
|
||
|
ERR("pthread_setcancelstate: %s", strerror(ret));
|
||
|
}
|
||
|
}
|
||
|
static int dup_std_fd(int fd)
|
||
- « Previous
- 1
- 2
- Next »