libust: New transport mutex v2
[ust.git] / libust / tracer.h
index c316c9aefe6bc3d128781633b0cd8773efc79f54..2f489f6c7df314a94fdb9208264caec8b57ce6b9 100644 (file)
@@ -185,9 +185,9 @@ struct ust_trace {
        struct {
                struct dentry                   *trace_root;
        } dentry;
-       struct kref kref; /* Each channel has a kref of the trace struct */
+       struct urcu_ref urcu_ref; /* Each channel has a urcu_ref of the trace struct */
        struct ltt_transport *transport;
-       struct kref ltt_transport_kref;
+       struct urcu_ref ltt_transport_urcu_ref;
        char trace_name[NAME_MAX];
 } ____cacheline_aligned;
 
@@ -343,21 +343,36 @@ static __inline__ void ltt_write_trace_header(struct ust_trace *trace,
        header->freq_scale = trace->freq_scale;
 }
 
+#ifndef UST_VALGRIND
+
 static __inline__ int ust_get_cpu(void)
 {
-#ifndef UST_VALGRIND
-       return sched_getcpu();
-#else
-       /* Valgrind does not support the sched_getcpu() vsyscall.
+       int cpu;
+
+       cpu = sched_getcpu();
+       if (likely(cpu >= 0))
+               return cpu;
+       /*
+        * If getcpu(2) is not implemented in the Kernel use CPU 0 as fallback.
+        */
+       return 0;
+}
+
+#else  /* #else #ifndef UST_VALGRIND */
+
+static __inline__ int ust_get_cpu(void)
+{
+       /*
+        * Valgrind does not support the sched_getcpu() vsyscall.
         * It causes it to detect a segfault in the program and stop it.
         * So if we want to check libust with valgrind, we have to refrain
         * from using this call. TODO: it would probably be better to return
         * other values too, to better test it.
         */
        return 0;
-#endif
 }
 
+#endif /* #else #ifndef UST_VALGRIND */
 
 /*
  * Size reserved for high priority events (interrupts, NMI, BH) at the end of a
@@ -427,8 +442,8 @@ extern void ltt_core_register(int (*function)(u8, void *));
 
 extern void ltt_core_unregister(void);
 
-extern void ltt_release_trace(struct kref *kref);
-extern void ltt_release_transport(struct kref *kref);
+extern void ltt_release_trace(struct urcu_ref *urcu_ref);
+extern void ltt_release_transport(struct urcu_ref *urcu_ref);
 
 extern void ltt_dump_marker_state(struct ust_trace *trace);
 
This page took 0.023418 seconds and 4 git commands to generate.