X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust-comm%2Flttng-ust-fd-tracker.c;h=42c3984cc2d3a390f941005f82a0315aa329c208;hb=48a143c09cc97bf7a2ace811277e7d60b294b5f6;hp=9659f349e54ac85a3afad50b2cfc2055abcfacfc;hpb=96a6162e1925d4bd1dfc6f4167d75f396c0dbe4c;p=lttng-ust.git diff --git a/liblttng-ust-comm/lttng-ust-fd-tracker.c b/liblttng-ust-comm/lttng-ust-fd-tracker.c index 9659f349..42c3984c 100644 --- a/liblttng-ust-comm/lttng-ust-fd-tracker.c +++ b/liblttng-ust-comm/lttng-ust-fd-tracker.c @@ -77,12 +77,20 @@ 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. This also tracks whether - * we are invoking close() from a signal handler nested on an - * application thread. + * system call override by LD_PRELOAD library. Threads registered + * as being lttng-ust listener threads need to perform fd tracker + * locking explicitly around their use of file descriptor manipulation + * functions. + */ +static DEFINE_URCU_TLS(int, thread_fd_tracking); + +/* + * Track whether we are invoking close() from a signal handler nested on + * an application thread. */ static DEFINE_URCU_TLS(int, ust_fd_mutex_nest); + /* fd_set used to book keep fd being used by lttng-ust. */ static fd_set *lttng_fd_set; static int lttng_ust_max_fd; @@ -94,6 +102,7 @@ static int init_done; */ void lttng_ust_fixup_fd_tracker_tls(void) { + asm volatile ("" : : "m" (URCU_TLS(thread_fd_tracking))); asm volatile ("" : : "m" (URCU_TLS(ust_fd_mutex_nest))); } @@ -348,7 +357,7 @@ int lttng_ust_safe_close_fd(int fd, int (*close_cb)(int fd)) * If called from lttng-ust, we directly call close without * validating whether the FD is part of the tracked set. */ - if (URCU_TLS(ust_fd_mutex_nest)) + if (URCU_TLS(thread_fd_tracking)) return close_cb(fd); lttng_ust_lock_fd_tracker(); @@ -384,7 +393,7 @@ int lttng_ust_safe_fclose_stream(FILE *stream, int (*fclose_cb)(FILE *stream)) * If called from lttng-ust, we directly call fclose without * validating whether the FD is part of the tracked set. */ - if (URCU_TLS(ust_fd_mutex_nest)) + if (URCU_TLS(thread_fd_tracking)) return fclose_cb(stream); fd = fileno(stream); @@ -447,7 +456,7 @@ int lttng_ust_safe_closefrom_fd(int lowfd, int (*close_cb)(int fd)) * If called from lttng-ust, we directly call close without * validating whether the FD is part of the tracked set. */ - if (URCU_TLS(ust_fd_mutex_nest)) { + if (URCU_TLS(thread_fd_tracking)) { for (i = lowfd; i < lttng_ust_max_fd; i++) { if (close_cb(i) < 0) { switch (errno) { @@ -492,3 +501,8 @@ int lttng_ust_safe_closefrom_fd(int lowfd, int (*close_cb)(int fd)) end: return ret; } + +void lttng_ust_fd_tracker_register_thread(void) +{ + URCU_TLS(thread_fd_tracking) = 1; +}