X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libust%2Ftracer.h;h=2f489f6c7df314a94fdb9208264caec8b57ce6b9;hb=8d6300d3b3cb0219e1109e931a2219dbd812b24d;hp=c316c9aefe6bc3d128781633b0cd8773efc79f54;hpb=0222e1213f196b66cbc08cd29093aca4a28e9ffb;p=ust.git diff --git a/libust/tracer.h b/libust/tracer.h index c316c9a..2f489f6 100644 --- a/libust/tracer.h +++ b/libust/tracer.h @@ -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);