Hi, I am trying to create wrappers for pthreads conditional variables functions (wait, signal and broadcast) to insert tracepoints. I followed the same approach done for the mutex functions already provided with lttng, however I am running into some problems. Mainly the applications seem to get stuck when the conditional variable wrappers are enabled.
Here is my implementation for the wrapper functions: int pthread_cond_wait(pthread_cond_t *condition, pthread_mutex_t *mutex) { static int (*cond_wait)(pthread_cond_t *, pthread_mutex_t *); int retval; if (!cond_wait) { cond_wait = dlsym(RTLD_NEXT, "pthread_cond_wait"); if (!cond_wait) { if (thread_in_trace) { abort(); } fprintf(stderr, "unable to initialize pthread wrapper library.\n"); return EINVAL; } } if (thread_in_trace) { return cond_wait(condition, mutex); } thread_in_trace = 1; tracepoint(lttng_ust_pthread, pthread_cond_wait_begin, condition, mutex, LTTNG_UST_CALLER_IP()); retval = cond_wait(condition, mutex); tracepoint(lttng_ust_pthread, pthread_cond_wait_end, condition, mutex, LTTNG_UST_CALLER_IP()); thread_in_trace = 0; return retval; } int pthread_cond_signal(pthread_cond_t *condition) { static int (*cond_signal)(pthread_cond_t *); int retval; if (!cond_signal) { cond_signal = dlsym(RTLD_NEXT, "pthread_cond_signal"); if (!cond_signal) { if (thread_in_trace) { abort(); } fprintf(stderr, "unable to initialize pthread wrapper library.\n"); return EINVAL; } } if (thread_in_trace) { return cond_signal(condition); } thread_in_trace = 1; tracepoint(lttng_ust_pthread, pthread_cond_signal_begin, condition, LTTNG_UST_CALLER_IP()); retval = cond_signal(condition); tracepoint(lttng_ust_pthread, pthread_cond_signal_end, condition, LTTNG_UST_CALLER_IP()); thread_in_trace = 0; return retval; } int pthread_cond_broadcast(pthread_cond_t *condition) { static int (*cond_broadcast)(pthread_cond_t *); int retval; if (!cond_broadcast) { cond_broadcast = dlsym(RTLD_NEXT, "pthread_cond_broadcast"); if (!cond_broadcast) { if (thread_in_trace) { abort(); } fprintf(stderr, "unable to initialize pthread wrapper library.\n"); return EINVAL; } } if (thread_in_trace) { return cond_broadcast(condition); } thread_in_trace = 1; tracepoint(lttng_ust_pthread, pthread_cond_broadcast_begin, condition, LTTNG_UST_CALLER_IP()); retval = cond_broadcast(condition); tracepoint(lttng_ust_pthread, pthread_cond_broadcast_end, condition, LTTNG_UST_CALLER_IP()); thread_in_trace = 0; return retval; } Things I have tried: 1- Comment out pthread_cond_wait function --> segmentation fault 2- Comment out pthread_cond_signal and _broadcast --> stuck (I can see the program is still running but nor forward progress is being made) compared to the case when the wrappers are not preloaded. 3- Comment out all tracepoint related code (basically the wrapper just call the corresponding pthreads function) --> same results as points 1 and 2. Any idea what might be causing this or how I could debug this problem? Thank you very much in advance. Best Regards, Shehab
int pthread_cond_wait(pthread_cond_t *condition, pthread_mutex_t *mutex) { static int (*cond_wait)(pthread_cond_t *, pthread_mutex_t *); int retval; if (!cond_wait) { cond_wait = dlsym(RTLD_NEXT, "pthread_cond_wait"); if (!cond_wait) { if (thread_in_trace) { abort(); } fprintf(stderr, "unable to initialize pthread wrapper library.\n"); return EINVAL; } } if (thread_in_trace) { return cond_wait(condition, mutex); } thread_in_trace = 1; tracepoint(lttng_ust_pthread, pthread_cond_wait_begin, condition, mutex, LTTNG_UST_CALLER_IP()); retval = cond_wait(condition, mutex); tracepoint(lttng_ust_pthread, pthread_cond_wait_end, condition, mutex, LTTNG_UST_CALLER_IP()); thread_in_trace = 0; return retval; } int pthread_cond_signal(pthread_cond_t *condition) { static int (*cond_signal)(pthread_cond_t *); int retval; if (!cond_signal) { cond_signal = dlsym(RTLD_NEXT, "pthread_cond_signal"); if (!cond_signal) { if (thread_in_trace) { abort(); } fprintf(stderr, "unable to initialize pthread wrapper library.\n"); return EINVAL; } } if (thread_in_trace) { return cond_signal(condition); } thread_in_trace = 1; tracepoint(lttng_ust_pthread, pthread_cond_signal_begin, condition, LTTNG_UST_CALLER_IP()); retval = cond_signal(condition); tracepoint(lttng_ust_pthread, pthread_cond_signal_end, condition, LTTNG_UST_CALLER_IP()); thread_in_trace = 0; return retval; } int pthread_cond_broadcast(pthread_cond_t *condition) { static int (*cond_broadcast)(pthread_cond_t *); int retval; if (!cond_broadcast) { cond_broadcast = dlsym(RTLD_NEXT, "pthread_cond_broadcast"); if (!cond_broadcast) { if (thread_in_trace) { abort(); } fprintf(stderr, "unable to initialize pthread wrapper library.\n"); return EINVAL; } } if (thread_in_trace) { return cond_broadcast(condition); } thread_in_trace = 1; tracepoint(lttng_ust_pthread, pthread_cond_broadcast_begin, condition, LTTNG_UST_CALLER_IP()); retval = cond_broadcast(condition); tracepoint(lttng_ust_pthread, pthread_cond_broadcast_end, condition, LTTNG_UST_CALLER_IP()); thread_in_trace = 0; return retval; }
_______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev