Implement getcpu override
[lttng-ust.git] / liblttng-ust / lttng-ust-comm.c
index a73808e1128f7b63fbb62422e5f7bccc5115a9b4..cc5188f6112cb744ddd45297973cef532201d9a6 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #define _LGPL_SOURCE
+#define _GNU_SOURCE
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/mman.h>
@@ -52,6 +53,8 @@
 #include "compat.h"
 #include "../libringbuffer/tlsfixup.h"
 #include "lttng-ust-baddr.h"
+#include "clock.h"
+#include "../libringbuffer/getcpu.h"
 
 /*
  * Has lttng ust comm constructor been called ?
@@ -68,9 +71,14 @@ static int initialized;
  *
  * ust_exit_mutex must never nest in ust_mutex.
  *
+ * ust_fork_mutex must never nest in ust_mutex.
+ *
  * ust_mutex_nest is a per-thread nesting counter, allowing the perf
  * counter lazy initialization called by events within the statedump,
  * which traces while the ust_mutex is held.
+ *
+ * ust_lock nests within the dynamic loader lock (within glibc) because
+ * it is taken within the library constructor.
  */
 static pthread_mutex_t ust_mutex = PTHREAD_MUTEX_INITIALIZER;
 
@@ -330,6 +338,16 @@ void lttng_fixup_ust_mutex_nest_tls(void)
        asm volatile ("" : : "m" (URCU_TLS(ust_mutex_nest)));
 }
 
+/*
+ * Fixup urcu bp TLS.
+ */
+static
+void lttng_fixup_urcu_bp_tls(void)
+{
+       rcu_read_lock();
+       rcu_read_unlock();
+}
+
 int lttng_get_notify_socket(void *owner)
 {
        struct sock_info *info = owner;
@@ -513,8 +531,8 @@ void handle_pending_statedump(struct sock_info *sock_info)
        int ctor_passed = sock_info->constructor_sem_posted;
 
        if (ctor_passed && sock_info->statedump_pending) {
-               pthread_mutex_lock(&ust_fork_mutex);
                sock_info->statedump_pending = 0;
+               pthread_mutex_lock(&ust_fork_mutex);
                lttng_handle_pending_statedump(sock_info);
                pthread_mutex_unlock(&ust_fork_mutex);
        }
@@ -1414,6 +1432,7 @@ void __attribute__((constructor)) lttng_ust_init(void)
         * to be the dynamic linker mutex) and ust_lock, taken within
         * the ust lock.
         */
+       lttng_fixup_urcu_bp_tls();
        lttng_fixup_ringbuffer_tls();
        lttng_fixup_vtid_tls();
        lttng_fixup_nest_count_tls();
@@ -1428,6 +1447,8 @@ void __attribute__((constructor)) lttng_ust_init(void)
         */
        init_usterr();
        init_tracepoint();
+       lttng_ust_clock_init();
+       lttng_ust_getcpu_init();
        lttng_ust_baddr_statedump_init();
        lttng_ring_buffer_metadata_client_init();
        lttng_ring_buffer_client_overwrite_init();
This page took 0.025525 seconds and 4 git commands to generate.