[ltt-dev] [UST commit] Tracepoint and TRACEPOINT_EVENT API cleanup
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Thu May 19 11:39:38 EDT 2011
commit 8161463975e218e0833d31ab1577a7ceb9e8e9f3
Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Date: Thu May 19 11:29:57 2011 -0400
Tracepoint and TRACEPOINT_EVENT API cleanup
We want to move towards a TRACEPOINT_EVENT-based API only, so start
cleaning up right now.
Prefix with _ or __ all members that are internal to UST. Move all the
non-exported API members (that don't need to be around in program
inclusion) to tracepoint-internal.h (which is not meant to be installed
on the system).
Unit tests can still use the internal API members for now, but should
gradually move to use TRACEPOINT_EVENT as we start implementing the
FIELDS() declaration.
TRACEPOINT_EVENT is changed from the kernel incarnation (TRACE_EVENT):
we take only 3 arguments: proto, args and fields. The "fields" describe
the event layout _and_ targets the data source.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
diff --git a/include/ust/define_trace.h b/include/ust/define_trace.h
index 3d29541..f377ddb 100644
--- a/include/ust/define_trace.h
+++ b/include/ust/define_trace.h
@@ -40,25 +40,20 @@
#include <ust/kcompat/stringify.h>
#undef TRACEPOINT_EVENT
-#define TRACEPOINT_EVENT(name, proto, args, tstruct, assign, print) \
- DEFINE_TRACEPOINT(name)
+#define TRACEPOINT_EVENT(name, proto, args, fields) \
+ _DEFINE_TRACEPOINT(name)
-#undef TRACEPOINT_EVENT_FN
-#define TRACEPOINT_EVENT_FN(name, proto, args, tstruct, \
- assign, print, reg, unreg) \
- DEFINE_TRACEPOINT_FN(name, reg, unreg)
+#undef TRACEPOINT_EVENT_INSTANCE
+#define TRACEPOINT_EVENT_INSTANCE(template, name, proto, args) \
+ _DEFINE_TRACEPOINT(name)
-#undef DEFINE_TRACEPOINT_EVENT
-#define DEFINE_TRACEPOINT_EVENT(template, name, proto, args) \
- DEFINE_TRACEPOINT(name)
+#undef TRACEPOINT_EVENT_NOARGS
+#define TRACEPOINT_EVENT_NOARGS(name, fields) \
+ _DEFINE_TRACEPOINT(name)
-#undef DEFINE_TRACEPOINT_EVENT_PRINT
-#define DEFINE_TRACEPOINT_EVENT_PRINT(template, name, proto, args, print) \
- DEFINE_TRACEPOINT(name)
-
-#undef DECLARE_TRACEPOINT
-#define DECLARE_TRACEPOINT(name, proto, args) \
- DEFINE_TRACEPOINT(name)
+#undef TRACEPOINT_EVENT_INSTANCE_NOARGS
+#define TRACEPOINT_EVENT_INSTANCE_NOARGS(template, name) \
+ _DEFINE_TRACEPOINT(name)
#undef TRACE_INCLUDE
#undef __TRACE_INCLUDE
@@ -82,21 +77,17 @@
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
-/* Make all open coded DECLARE_TRACEPOINT nops */
-#undef DECLARE_TRACEPOINT
-#define DECLARE_TRACEPOINT(name, proto, args)
-
#ifndef CONFIG_NO_EVENT_TRACING
#include <ust/ust_trace.h>
#endif
#undef TRACEPOINT_EVENT
-#undef TRACEPOINT_EVENT_FN
-#undef DECLARE_TRACEPOINT_EVENT_CLASS
-#undef DEFINE_TRACEPOINT_EVENT
-#undef DEFINE_TRACEPOINT_EVENT_PRINT
+#undef TRACEPOINT_EVENT_CLASS
+#undef TRACEPOINT_EVENT_INSTANCE
+#undef TRACEPOINT_EVENT_NOARGS
+#undef TRACEPOINT_EVENT_CLASS_NOARGS
+#undef TRACEPOINT_EVENT_INSTANCE_NOARGS
#undef TRACE_HEADER_MULTI_READ
-#undef DECLARE_TRACEPOINT
/* Only undef what we defined in this file */
#ifdef UNDEF_TRACE_INCLUDE_FILE
diff --git a/include/ust/tracepoint-internal.h b/include/ust/tracepoint-internal.h
new file mode 100644
index 0000000..6fcc491
--- /dev/null
+++ b/include/ust/tracepoint-internal.h
@@ -0,0 +1,86 @@
+#ifndef _UST_TRACEPOINT_INTERNAL_H
+#define _UST_TRACEPOINT_INTERNAL_H
+
+/*
+ * tracepoint-internal.h
+ *
+ * Tracepoint internal header.
+ *
+ * Copyright (C) 2008 Mathieu Desnoyers <mathieu.desnoyers at polymtl.ca>
+ * Copyright (C) 2009 Pierre-Marc Fournier
+ * Copyright (C) 2009 Steven Rostedt <rostedt at goodmis.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Heavily inspired from the Linux Kernel Markers.
+ *
+ * Ported to userspace by Pierre-Marc Fournier.
+ */
+
+#include <urcu-bp.h>
+#include <ust/core.h>
+#include <urcu/list.h>
+
+extern void tracepoint_update_probe_range(struct tracepoint * const *begin,
+ struct tracepoint * const *end);
+
+extern int tracepoint_probe_register_noupdate(const char *name, void *probe,
+ void *data);
+extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe,
+ void *data);
+extern void tracepoint_probe_update_all(void);
+
+struct tracepoint_iter {
+ struct tracepoint_lib *lib;
+ struct tracepoint * const *tracepoint;
+};
+
+extern void tracepoint_iter_start(struct tracepoint_iter *iter);
+extern void tracepoint_iter_next(struct tracepoint_iter *iter);
+extern void tracepoint_iter_stop(struct tracepoint_iter *iter);
+extern void tracepoint_iter_reset(struct tracepoint_iter *iter);
+extern int tracepoint_get_iter_range(struct tracepoint * const **tracepoint,
+ struct tracepoint * const *begin, struct tracepoint * const *end);
+
+/*
+ * tracepoint_synchronize_unregister must be called between the last tracepoint
+ * probe unregistration and the end of module exit to make sure there is no
+ * caller executing a probe when it is freed.
+ */
+static inline void tracepoint_synchronize_unregister(void)
+{
+ synchronize_rcu();
+}
+
+extern void lock_trace_events(void);
+extern void unlock_trace_events(void);
+
+struct trace_event_iter {
+ struct trace_event_lib *lib;
+ struct trace_event * const *trace_event;
+};
+
+extern void trace_event_iter_start(struct trace_event_iter *iter);
+extern void trace_event_iter_next(struct trace_event_iter *iter);
+extern void trace_event_iter_reset(struct trace_event_iter *iter);
+
+extern int trace_event_get_iter_range(struct trace_event * const **trace_event,
+ struct trace_event * const *begin,
+ struct trace_event * const *end);
+
+extern void trace_event_update_process(void);
+extern int is_trace_event_enabled(const char *channel, const char *name);
+
+#endif /* _UST_TRACEPOINT_INTERNAL_H */
diff --git a/include/ust/tracepoint.h b/include/ust/tracepoint.h
index b11d69d..4d84ead 100644
--- a/include/ust/tracepoint.h
+++ b/include/ust/tracepoint.h
@@ -29,8 +29,6 @@
#include <ust/core.h>
#include <urcu/list.h>
-struct tracepoint;
-
struct tracepoint_probe {
void *func;
void *data;
@@ -42,24 +40,33 @@ struct tracepoint {
struct tracepoint_probe *probes;
};
-#define TP_PARAMS(args...) args
-#define TP_PROTO(args...) args
-#define TP_ARGS(args...) args
-
/*
* Tracepoints should be added to the instrumented code using the
* "tracepoint()" macro.
*/
#define tracepoint(name, args...) __trace_##name(args)
-#define register_tracepoint(name, probe, data) \
- __register_trace_##name(probe, data)
-
-#define unregister_tracepoint(name, probe, data) \
- __unregister_trace_##name(probe, data)
-
-#define CONFIG_TRACEPOINTS
-#ifdef CONFIG_TRACEPOINTS
+/*
+ * Library should be made known to libust by declaring TRACEPOINT_LIB in
+ * the source file. (Usually at the end of the file, in the outermost
+ * scope).
+ */
+#define TRACEPOINT_LIB \
+ extern struct tracepoint * const __start___tracepoints_ptrs[] __attribute__((weak, visibility("hidden"))); \
+ extern struct tracepoint * const __stop___tracepoints_ptrs[] __attribute__((weak, visibility("hidden"))); \
+ static struct tracepoint * __tracepoint_ptr_dummy \
+ __attribute__((used, section("__tracepoints_ptrs"))); \
+ static void __attribute__((constructor)) __tracepoints__init(void) \
+ { \
+ tracepoint_register_lib(__start___tracepoints_ptrs, \
+ __stop___tracepoints_ptrs - \
+ __start___tracepoints_ptrs); \
+ } \
+ \
+ static void __attribute__((destructor)) __tracepoints__destroy(void) \
+ { \
+ tracepoint_unregister_lib(__start___tracepoints_ptrs); \
+ }
/*
* it_func[0] is never NULL because there is at least one element in the array
@@ -83,6 +90,10 @@ struct tracepoint {
rcu_read_unlock(); \
} while (0)
+#define TP_PARAMS(args...) args
+#define TP_PROTO(args...) args
+#define TP_ARGS(args...) args
+
#define __CHECK_TRACE(name, proto, args) \
do { \
if (unlikely(__tracepoint_##name.state)) \
@@ -105,63 +116,19 @@ struct tracepoint {
static inline int \
__register_trace_##name(void (*probe)(data_proto), void *data) \
{ \
- return tracepoint_probe_register(#name, (void *)probe, \
+ return __tracepoint_probe_register(#name, (void *)probe,\
data); \
\
} \
static inline int \
__unregister_trace_##name(void (*probe)(data_proto), void *data)\
{ \
- return tracepoint_probe_unregister(#name, (void *)probe, \
+ return __tracepoint_probe_unregister(#name, (void *)probe, \
data); \
}
/*
- * __tracepoints_ptrs section is not const (read-only) to let the linker update
- * the pointer, allowing PIC code.
- */
-#define DEFINE_TRACEPOINT_FN(name, reg, unreg) \
- static const char __tpstrtab_##name[] \
- __attribute__((section("__tracepoints_strings"))) = #name; \
- struct tracepoint __tracepoint_##name \
- __attribute__((section("__tracepoints"))) = \
- { __tpstrtab_##name, 0, NULL }; \
- static struct tracepoint * __tracepoint_ptr_##name \
- __attribute__((used, section("__tracepoints_ptrs"))) = \
- &__tracepoint_##name;
-
-#define DEFINE_TRACEPOINT(name) \
- DEFINE_TRACEPOINT_FN(name, NULL, NULL)
-
-extern void tracepoint_update_probe_range(struct tracepoint * const *begin,
- struct tracepoint * const *end);
-
-#else /* !CONFIG_TRACEPOINTS */
-#define __DECLARE_TRACEPOINT(name, proto, args) \
- static inline void trace_##name(proto) \
- { } \
- static inline void _trace_##name(proto) \
- { } \
- static inline int __register_trace_##name(void (*probe)(proto), void *data) \
- { \
- return -ENOSYS; \
- } \
- static inline int __unregister_trace_##name(void (*probe)(proto), void *data) \
- { \
- return -ENOSYS; \
- }
-
-#define DEFINE_TRACEPOINT(name)
-#define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
-#define EXPORT_TRACEPOINT_SYMBOL(name)
-
-static inline void tracepoint_update_probe_range(struct tracepoint *begin,
- struct tracepoint *end)
-{ }
-#endif /* CONFIG_TRACEPOINTS */
-
-/*
- * The need for the DECLARE_TRACEPOINT_NOARGS() is to handle the prototype
+ * The need for the _DECLARE_TRACEPOINT_NOARGS() is to handle the prototype
* (void). "void" is a special value in a function prototype and can
* not be combined with other arguments. Since the DECLARE_TRACEPOINT()
* macro adds a data element at the beginning of the prototype,
@@ -174,53 +141,47 @@ static inline void tracepoint_update_probe_range(struct tracepoint *begin,
* DECLARE_TRACEPOINT() passes "proto" as the tracepoint protoype and
* "void *__tp_cb_data, proto" as the callback prototype.
*/
-#define DECLARE_TRACEPOINT_NOARGS(name) \
- __DECLARE_TRACEPOINT(name, void, , void *__tp_cb_data, __tp_cb_data)
+#define _DECLARE_TRACEPOINT_NOARGS(name) \
+ __DECLARE_TRACEPOINT(name, void, , void *__tp_cb_data, __tp_cb_data)
-#define DECLARE_TRACEPOINT(name, proto, args) \
- __DECLARE_TRACEPOINT(name, TP_PARAMS(proto), TP_PARAMS(args),\
- TP_PARAMS(void *__tp_cb_data, proto), \
- TP_PARAMS(__tp_cb_data, args))
+#define _DECLARE_TRACEPOINT(name, proto, args) \
+ __DECLARE_TRACEPOINT(name, TP_PARAMS(proto), TP_PARAMS(args), \
+ TP_PARAMS(void *__tp_cb_data, proto), \
+ TP_PARAMS(__tp_cb_data, args))
/*
- * Connect a probe to a tracepoint.
- * Internal API, should not be used directly.
- */
-extern int tracepoint_probe_register(const char *name, void *probe, void *data);
-
-/*
- * Disconnect a probe from a tracepoint.
- * Internal API, should not be used directly.
+ * __tracepoints_ptrs section is not const (read-only) to let the linker update
+ * the pointer, allowing PIC code.
*/
-extern int tracepoint_probe_unregister(const char *name, void *probe, void *data);
+#define _DEFINE_TRACEPOINT(name) \
+ static const char __tpstrtab_##name[] \
+ __attribute__((section("__tracepoints_strings"))) = #name; \
+ struct tracepoint __tracepoint_##name \
+ __attribute__((section("__tracepoints"))) = \
+ { __tpstrtab_##name, 0, NULL }; \
+ static struct tracepoint * __tracepoint_ptr_##name \
+ __attribute__((used, section("__tracepoints_ptrs"))) = \
+ &__tracepoint_##name;
-extern int tracepoint_probe_register_noupdate(const char *name, void *probe,
- void *data);
-extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe,
- void *data);
-extern void tracepoint_probe_update_all(void);
-struct tracepoint_iter {
- struct tracepoint_lib *lib;
- struct tracepoint * const *tracepoint;
-};
+#define __register_tracepoint(name, probe, data) \
+ __register_trace_##name(probe, data)
+#define __unregister_tracepoint(name, probe, data) \
+ __unregister_trace_##name(probe, data)
-extern void tracepoint_iter_start(struct tracepoint_iter *iter);
-extern void tracepoint_iter_next(struct tracepoint_iter *iter);
-extern void tracepoint_iter_stop(struct tracepoint_iter *iter);
-extern void tracepoint_iter_reset(struct tracepoint_iter *iter);
-extern int tracepoint_get_iter_range(struct tracepoint * const **tracepoint,
- struct tracepoint * const *begin, struct tracepoint * const *end);
+/*
+ * Connect a probe to a tracepoint.
+ * Internal API.
+ */
+extern
+int __tracepoint_probe_register(const char *name, void *probe, void *data);
/*
- * tracepoint_synchronize_unregister must be called between the last tracepoint
- * probe unregistration and the end of module exit to make sure there is no
- * caller executing a probe when it is freed.
+ * Disconnect a probe from a tracepoint.
+ * Internal API.
*/
-static inline void tracepoint_synchronize_unregister(void)
-{
-//ust// synchronize_sched();
-}
+extern
+int __tracepoint_probe_unregister(const char *name, void *probe, void *data);
struct tracepoint_lib {
struct tracepoint * const *tracepoints_start;
@@ -228,26 +189,11 @@ struct tracepoint_lib {
struct cds_list_head list;
};
-extern int tracepoint_register_lib(struct tracepoint * const *tracepoints_start,
- int tracepoints_count);
-extern int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_start);
-
-#define TRACEPOINT_LIB \
- extern struct tracepoint * const __start___tracepoints_ptrs[] __attribute__((weak, visibility("hidden"))); \
- extern struct tracepoint * const __stop___tracepoints_ptrs[] __attribute__((weak, visibility("hidden"))); \
- static struct tracepoint * __tracepoint_ptr_dummy \
- __attribute__((used, section("__tracepoints_ptrs"))); \
- static void __attribute__((constructor)) __tracepoints__init(void) \
- { \
- tracepoint_register_lib(__start___tracepoints_ptrs, \
- __stop___tracepoints_ptrs - \
- __start___tracepoints_ptrs); \
- } \
- \
- static void __attribute__((destructor)) __tracepoints__destroy(void) \
- { \
- tracepoint_unregister_lib(__start___tracepoints_ptrs); \
- }
+extern
+int tracepoint_register_lib(struct tracepoint * const *tracepoints_start,
+ int tracepoints_count);
+extern
+int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_start);
#ifndef TRACEPOINT_EVENT
@@ -284,108 +230,61 @@ extern int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_star
*
* *
* * Fast binary tracing: define the trace record via
- * * TP_STRUCT__entry(). You can think about it like a
+ * * TP_FIELDS(). You can think about it like a
* * regular C structure local variable definition.
* *
* * This is how the trace record is structured and will
* * be saved into the ring buffer. These are the fields
* * that will be exposed to readers.
* *
- * * The declared 'local variable' is called '__entry'
+ * * tp_field(pid_t, prev_pid, prev->pid) is equivalent
+ * * to a standard declaraton:
* *
- * * __field(pid_t, prev_prid) is equivalent to a standard declariton:
+ * * pid_t prev_pid;
* *
- * * pid_t prev_pid;
+ * * followed by an assignment:
* *
- * * __array(char, prev_comm, TASK_COMM_LEN) is equivalent to:
+ * * prev_pid = prev->pid;
* *
- * * char prev_comm[TASK_COMM_LEN];
+ * * tp_array(char, prev_comm, TASK_COMM_LEN, prev->comm) is
+ * * equivalent to:
* *
- *
- * TP_STRUCT__entry(
- * __array( char, prev_comm, TASK_COMM_LEN )
- * __field( pid_t, prev_pid )
- * __field( int, prev_prio )
- * __array( char, next_comm, TASK_COMM_LEN )
- * __field( pid_t, next_pid )
- * __field( int, next_prio )
- * ),
- *
+ * * char prev_comm[TASK_COMM_LEN];
* *
- * * Assign the entry into the trace record, by embedding
- * * a full C statement block into TP_fast_assign(). You
- * * can refer to the trace record as '__entry' -
- * * otherwise you can put arbitrary C code in here.
+ * * followed by an assignment:
* *
- * * Note: this C code will execute every time a trace event
- * * happens, on an active tracepoint.
+ * * memcpy(prev_comm, prev->comm, TASK_COMM_LEN);
* *
*
- * TP_fast_assign(
- * memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN);
- * __entry->prev_pid = prev->pid;
- * __entry->prev_prio = prev->prio;
- * memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN);
- * __entry->next_pid = next->pid;
- * __entry->next_prio = next->prio;
+ * TP_FIELDS(
+ * tp_array(char, prev_comm, TASK_COMM_LEN, prev->comm)
+ * tp_field(pid_t, prev_pid, prev->pid)
+ * tp_field(int, prev_prio, prev->prio)
+ * tp_array(char, next_comm, TASK_COMM_LEN, next->comm)
+ * tp_field(pid_t, next_pid, next->pid)
+ * tp_field(int, next_prio, next->prio)
* )
- *
- * *
- * * Formatted output of a trace record via TP_printf().
- * * This is how the tracepoint will appear under debugging
- * * of tracepoints.
- * *
- * * (raw-binary tracing wont actually perform this step.)
- * *
- *
- * TP_printf("task %s:%d [%d] ==> %s:%d [%d]",
- * __entry->prev_comm, __entry->prev_pid, __entry->prev_prio,
- * __entry->next_comm, __entry->next_pid, __entry->next_prio),
- *
* );
- *
- * This macro construct is thus used for the regular printf format
- * tracing setup.
- *
- * A set of (un)registration functions can be passed to the variant
- * TRACEPOINT_EVENT_FN to perform any (un)registration work.
*/
-struct trace_event {
- const char *name;
- int (*regfunc)(void *data);
- int (*unregfunc)(void *data);
-};
+#define TRACEPOINT_EVENT(name, proto, args, fields) \
+ _DECLARE_TRACEPOINT(name, TP_PARAMS(proto), TP_PARAMS(args))
-struct trace_event_lib {
- struct trace_event * const *trace_events_start;
- int trace_events_count;
- struct cds_list_head list;
-};
+#define TRACEPOINT_EVENT_CLASS(name, proto, args, fields)
+#define TRACEPOINT_EVENT_INSTANCE(template, name, proto, args) \
+ _DECLARE_TRACEPOINT(name, TP_PARAMS(proto), TP_PARAMS(args))
-struct trace_event_iter {
- struct trace_event_lib *lib;
- struct trace_event * const *trace_event;
-};
-
-extern void lock_trace_events(void);
-extern void unlock_trace_events(void);
-
-extern void trace_event_iter_start(struct trace_event_iter *iter);
-extern void trace_event_iter_next(struct trace_event_iter *iter);
-extern void trace_event_iter_reset(struct trace_event_iter *iter);
-
-extern int trace_event_get_iter_range(struct trace_event * const **trace_event,
- struct trace_event * const *begin,
- struct trace_event * const *end);
+/*
+ * Declaration of tracepoints that take 0 argument.
+ */
+#define TRACEPOINT_EVENT_NOARGS(name, fields) \
+ _DECLARE_TRACEPOINT_NOARGS(name)
-extern void trace_event_update_process(void);
-extern int is_trace_event_enabled(const char *channel, const char *name);
+#define TRACEPOINT_EVENT_CLASS_NOARGS(name, fields)
+#define TRACEPOINT_EVENT_INSTANCE_NOARGS(template, name) \
+ _DECLARE_TRACEPOINT_NOARGS(name)
-extern int trace_event_register_lib(struct trace_event * const *start_trace_events,
- int trace_event_count);
-extern int trace_event_unregister_lib(struct trace_event * const *start_trace_events);
#define TRACEPOINT_EVENT_LIB \
extern struct trace_event * const __start___trace_events_ptrs[] \
@@ -408,19 +307,22 @@ extern int trace_event_unregister_lib(struct trace_event * const *start_trace_ev
trace_event_unregister_lib(__start___trace_events_ptrs);\
}
-#define DECLARE_TRACEPOINT_EVENT_CLASS(name, proto, args, tstruct, assign, print)
-#define DEFINE_TRACEPOINT_EVENT(template, name, proto, args) \
- DECLARE_TRACEPOINT(name, TP_PARAMS(proto), TP_PARAMS(args))
-#define DEFINE_TRACEPOINT_EVENT_PRINT(template, name, proto, args, print)\
- DECLARE_TRACEPOINT(name, TP_PARAMS(proto), TP_PARAMS(args))
+struct trace_event {
+ const char *name;
+};
-#define TRACEPOINT_EVENT(name, proto, args, struct, assign, print) \
- DECLARE_TRACEPOINT(name, TP_PARAMS(proto), TP_PARAMS(args))
-#define TRACEPOINT_EVENT_FN(name, proto, args, struct, \
- assign, print, reg, unreg) \
- DECLARE_TRACEPOINT(name, TP_PARAMS(proto), TP_PARAMS(args))
+struct trace_event_lib {
+ struct trace_event * const *trace_events_start;
+ int trace_events_count;
+ struct cds_list_head list;
+};
-#endif /* ifdef TRACEPOINT_EVENT (see note above) */
+extern
+int trace_event_register_lib(struct trace_event * const *start_trace_events,
+ int trace_event_count);
+extern
+int trace_event_unregister_lib(struct trace_event * const *start_trace_events);
+#endif /* #ifndef TRACEPOINT_EVENT */
#endif /* _UST_TRACEPOINT_H */
diff --git a/include/ust/ust_trace.h b/include/ust/ust_trace.h
index dfbe166..fe27da2 100644
--- a/include/ust/ust_trace.h
+++ b/include/ust/ust_trace.h
@@ -19,67 +19,69 @@
*/
/*
- * This whole file is currently a dummy, mapping a TRACEPOINT_EVENT
- * to a printf
+ * This whole file is currently a dummy.
*/
#include <stdio.h>
-/*
- * Stage 1. Create a struct and a printf calling function
- * that is connected to the tracepoint at load time.
- */
#undef TRACEPOINT_EVENT
-#define TRACEPOINT_EVENT(name, proto, args, tstruct, assign, print) \
- DECLARE_TRACEPOINT_EVENT_CLASS(name, \
- TP_PARAMS(proto), \
- TP_PARAMS(args), \
- TP_PARAMS(tstruct), \
- TP_PARAMS(assign), \
- TP_PARAMS(print)); \
- DEFINE_TRACEPOINT_EVENT(name, name, TP_PARAMS(proto), TP_PARAMS(args));
-
-#undef __field
-#define __field(type, item) type item;
+#define TRACEPOINT_EVENT(name, proto, args, fields) \
+ TRACEPOINT_EVENT_CLASS(name, \
+ TP_PARAMS(proto), \
+ TP_PARAMS(args), \
+ TP_PARAMS(fields)); \
+ TRACEPOINT_EVENT_INSTANCE(name, name, TP_PARAMS(proto), \
+ TP_PARAMS(args));
-#undef TP_STRUCT__entry
-#define TP_STRUCT__entry(args...) args
+#undef TRACEPOINT_EVENT_NOARGS
+#define TRACEPOINT_EVENT_NOARGS(name, fields) \
+ TRACEPOINT_EVENT_CLASS_NOARGS(name, \
+ TP_PARAMS(fields)); \
+ TRACEPOINT_EVENT_INSTANCE_NOARGS(name, name);
-#undef TP_printf
-#define TP_printf(fmt, args...) fmt "\n", args
+#undef tp_field
+#define tp_field(type, item, src) type item;
-#undef TP_fast_assign
-#define TP_fast_assign(args...) args
+#undef TP_FIELDS
+#define TP_FIELDS(args...) args
-#undef DEFINE_TRACEPOINT_EVENT
-#define DEFINE_TRACEPOINT_EVENT(template, name, proto, args)
+#undef TRACEPOINT_EVENT_INSTANCE
+#define TRACEPOINT_EVENT_INSTANCE(template, name, proto, args)
+#undef TRACEPOINT_EVENT_INSTANCE_NOARGS
+#define TRACEPOINT_EVENT_INSTANCE_NOARGS(template, name)
-#undef DECLARE_TRACEPOINT_EVENT_CLASS
-#define DECLARE_TRACEPOINT_EVENT_CLASS(name, proto, args, tstruct, assign, print) \
+#undef TRACEPOINT_EVENT_CLASS
+#define TRACEPOINT_EVENT_CLASS(name, proto, args, fields) \
struct trace_raw_##name { \
- tstruct \
+ fields \
}; \
static void trace_printf_##name(void *dummy, proto) \
{ \
- struct trace_raw_##name entry_struct, *__entry; \
- __entry = &entry_struct; \
- { assign }; \
- \
- printf(print); \
} \
- static inline int register_event_##name(void *data) \
+ struct trace_event __event_##name = { \
+ __tpstrtab_##name, \
+ }; \
+ static struct trace_event * const __event_ptrs_##name \
+ __attribute__((used, section("__trace_events_ptrs"))) = \
+ &__event_##name; \
+ \
+ static void __attribute__((constructor)) init_##name() \
{ \
- return register_tracepoint(name, trace_printf_##name, data); \
- } \
- static inline int unregister_event_##name(void *data) \
+ void *dummy = NULL; \
+ __register_tracepoint(name, trace_printf_##name, dummy);\
+ }
+
+#undef TRACEPOINT_EVENT_CLASS_NOARGS
+#define TRACEPOINT_EVENT_CLASS_NOARGS(name, fields) \
+ struct trace_raw_##name { \
+ fields \
+ }; \
+ static void trace_printf_##name(void *dummy) \
{ \
- return unregister_tracepoint(name, trace_printf_##name, data); \
} \
struct trace_event __event_##name = { \
__tpstrtab_##name, \
- register_event_##name, \
- unregister_event_##name \
}; \
static struct trace_event * const __event_ptrs_##name \
__attribute__((used, section("__trace_events_ptrs"))) = \
@@ -88,8 +90,7 @@
static void __attribute__((constructor)) init_##name() \
{ \
void *dummy = NULL; \
- register_tracepoint(name, trace_printf_##name, dummy); \
+ __register_tracepoint(name, trace_printf_##name, dummy);\
}
-
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
diff --git a/libust/marker.c b/libust/marker.c
index 9599975..0149e68 100644
--- a/libust/marker.c
+++ b/libust/marker.c
@@ -26,6 +26,7 @@
#include <ust/core.h>
#include <ust/marker.h>
#include <ust/tracepoint.h>
+#include <ust/tracepoint-internal.h>
#include "usterr_signal_safe.h"
#include "channels.h"
diff --git a/libust/trace_event.c b/libust/trace_event.c
index a605901..6b30b68 100644
--- a/libust/trace_event.c
+++ b/libust/trace_event.c
@@ -20,6 +20,7 @@
#define _LGPL_SOURCE
#include <errno.h>
#include <ust/tracepoint.h>
+#include <ust/tracepoint-internal.h>
#include <ust/core.h>
#include <ust/kcompat/kcompat.h>
#include <urcu-bp.h>
diff --git a/libust/tracectl.c b/libust/tracectl.c
index 2f45d6b..bd640c3 100644
--- a/libust/tracectl.c
+++ b/libust/tracectl.c
@@ -39,6 +39,7 @@
#include <ust/marker.h>
#include <ust/tracepoint.h>
+#include <ust/tracepoint-internal.h>
#include <ust/tracectl.h>
#include <ust/clock.h>
#include "tracer.h"
diff --git a/libust/tracepoint.c b/libust/tracepoint.c
index 737e5f5..6a8795b 100644
--- a/libust/tracepoint.c
+++ b/libust/tracepoint.c
@@ -22,6 +22,7 @@
#define _LGPL_SOURCE
#include <errno.h>
#include <ust/tracepoint.h>
+#include <ust/tracepoint-internal.h>
#include <ust/core.h>
#include <ust/kcompat/kcompat.h>
#include <urcu-bp.h>
@@ -354,14 +355,14 @@ tracepoint_add_probe(const char *name, void *probe, void *data)
}
/**
- * tracepoint_probe_register - Connect a probe to a tracepoint
+ * __tracepoint_probe_register - Connect a probe to a tracepoint
* @name: tracepoint name
* @probe: probe handler
*
* Returns 0 if ok, error value on error.
* The probe address must at least be aligned on the architecture pointer size.
*/
-int tracepoint_probe_register(const char *name, void *probe, void *data)
+int __tracepoint_probe_register(const char *name, void *probe, void *data)
{
void *old;
@@ -375,7 +376,6 @@ int tracepoint_probe_register(const char *name, void *probe, void *data)
release_probes(old);
return 0;
}
-//ust// EXPORT_SYMBOL_GPL(tracepoint_probe_register);
static void *tracepoint_remove_probe(const char *name, void *probe, void *data)
{
@@ -404,7 +404,7 @@ static void *tracepoint_remove_probe(const char *name, void *probe, void *data)
* itself uses stop_machine(), which insures that every preempt disabled section
* have finished.
*/
-int tracepoint_probe_unregister(const char *name, void *probe, void *data)
+int __tracepoint_probe_unregister(const char *name, void *probe, void *data)
{
void *old;
@@ -418,7 +418,6 @@ int tracepoint_probe_unregister(const char *name, void *probe, void *data)
release_probes(old);
return 0;
}
-//ust// EXPORT_SYMBOL_GPL(tracepoint_probe_unregister);
static CDS_LIST_HEAD(old_probes);
static int need_update;
diff --git a/tests/hello/hello.c b/tests/hello/hello.c
index a786fbf..bb44773 100644
--- a/tests/hello/hello.c
+++ b/tests/hello/hello.c
@@ -1,4 +1,6 @@
-/* Copyright (C) 2009 Pierre-Marc Fournier
+/*
+ * Copyright (C) 2009 Pierre-Marc Fournier
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -41,7 +43,7 @@ int init_int_handler(void)
struct sigaction act;
result = sigemptyset(&act.sa_mask);
- if(result == -1) {
+ if (result == -1) {
PERROR("sigemptyset");
return -1;
}
@@ -53,7 +55,7 @@ int init_int_handler(void)
* syscalls to disturb the traced program as little as possible.
*/
result = sigaction(SIGINT, &act, NULL);
- if(result == -1) {
+ if (result == -1) {
PERROR("sigaction");
return -1;
}
@@ -70,7 +72,7 @@ int main()
printf("Hello, World!\n");
sleep(1);
- for(i=0; i<50; i++) {
+ for (i = 0; i < 50; i++) {
ust_marker(bar, "str %s", "FOOBAZ");
ust_marker(bar2, "number1 %d number2 %d", 53, 9800);
tracepoint(hello_tptest, i);
diff --git a/tests/hello/tp.c b/tests/hello/tp.c
index 05cd7a2..dfe06dd 100644
--- a/tests/hello/tp.c
+++ b/tests/hello/tp.c
@@ -1,4 +1,6 @@
-/* Copyright (C) 2009 Pierre-Marc Fournier
+/*
+ * Copyright (C) 2009 Pierre-Marc Fournier
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -15,10 +17,12 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "tp.h"
#include <ust/marker.h>
#include "usterr.h"
+#define TRACEPOINT_CREATE_PROBES
+#include "tp.h"
+
struct hello_trace_struct {
char *message;
};
@@ -27,12 +31,10 @@ struct hello_trace_struct hello_struct = {
.message = "ehlo\n",
};
-DEFINE_TRACEPOINT(hello_tptest);
-
void tptest_probe(void *data, int anint)
{
struct hello_trace_struct *hello;
- hello=(struct hello_trace_struct *)data;
+ hello = (struct hello_trace_struct *)data;
DBG("in tracepoint probe...");
printf("this is the message: %s\n", hello->message);
}
@@ -44,6 +46,10 @@ void tptest2_probe(void *data)
static void __attribute__((constructor)) init()
{
DBG("connecting tracepoint...\n");
- register_tracepoint(hello_tptest, tptest_probe, &hello_struct);
- register_tracepoint(hello_tptest2, tptest2_probe, &hello_struct);
+ /*
+ * Note: this is an internal API that will be used within
+ * TRACEPOINT_EVENT only eventually.
+ */
+ __register_tracepoint(hello_tptest, tptest_probe, &hello_struct);
+ __register_tracepoint(hello_tptest2, tptest2_probe, &hello_struct);
}
diff --git a/tests/hello/tp.h b/tests/hello/tp.h
index 833cb40..d6d8d99 100644
--- a/tests/hello/tp.h
+++ b/tests/hello/tp.h
@@ -1,4 +1,11 @@
-/* Copyright (C) 2009 Pierre-Marc Fournier
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM tp
+
+#if !defined(_TRACE_TP_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_TP_H
+
+/*
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,8 +24,20 @@
#include <ust/tracepoint.h>
-DECLARE_TRACEPOINT(hello_tptest,
- TP_PROTO(int anint),
- TP_ARGS(anint));
+TRACEPOINT_EVENT(hello_tptest,
+ TP_PROTO(int anint),
+ TP_ARGS(anint),
+ TP_FIELDS());
+
+TRACEPOINT_EVENT_NOARGS(hello_tptest2,
+ TP_FIELDS());
+
+#endif /* _TRACE_TP_H */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE tp
-DECLARE_TRACEPOINT_NOARGS(hello_tptest2);
+/* This part must be outside protection */
+#include <ust/define_trace.h>
diff --git a/tests/register_test/register_test.c b/tests/register_test/register_test.c
index 8198a2c..1221e0a 100644
--- a/tests/register_test/register_test.c
+++ b/tests/register_test/register_test.c
@@ -1,4 +1,6 @@
-/* Copyright (C) 2010 Nils Carlson
+/*
+ * Copyright (C) 2010 Nils Carlson
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,10 +29,9 @@
#include <ust/marker.h>
#include "usterr.h"
-#include "tp.h"
-
-DEFINE_TRACEPOINT(hello_tptest);
+#define TRACEPOINT_CREATE_PROBES
+#include "tp.h"
struct hello_trace_struct {
char *message;
@@ -44,7 +45,7 @@ void tptest_probe(void *data, int anint)
{
struct hello_trace_struct *hello;
char message[30];
- hello=(struct hello_trace_struct *)data;
+ hello = (struct hello_trace_struct *)data;
//printf("this is the message: %s\n", hello->message);
snprintf(message, 30, "this is the %s\n", hello->message);
}
@@ -52,27 +53,26 @@ void tptest_probe(void *data, int anint)
#define HELLO_LENGTH 100
-static void * register_thread_main(void *data)
+static void *register_thread_main(void *data)
{
int i, j = 0;
-
struct hello_trace_struct hello[HELLO_LENGTH];
- for (i=0; i<HELLO_LENGTH; i++) {
- hello[i].message = malloc(6*sizeof(char));
- hello[i].message[0] = 'a'+i%25;
+ for (i = 0; i < HELLO_LENGTH; i++) {
+ hello[i].message = malloc(6 * sizeof(char));
+ hello[i].message[0] = 'a' + (i % 25);
memcpy(&hello[i].message[1], "ello", 5);
}
- for (i=0; i<1000; i++) {
- while (!register_tracepoint(hello_tptest, tptest_probe,
- &hello[j%HELLO_LENGTH])) {
+ for (i = 0; i < 1000; i++) {
+ while (!__register_tracepoint(hello_tptest, tptest_probe,
+ &hello[j % HELLO_LENGTH])) {
usleep(10);
j++;
}
printf("Registered all\n");
- while (!unregister_tracepoint(hello_tptest, tptest_probe,
- &hello[j%HELLO_LENGTH])) {
+ while (!__unregister_tracepoint(hello_tptest, tptest_probe,
+ &hello[j % HELLO_LENGTH])) {
usleep(10);
j++;
}
@@ -88,7 +88,7 @@ int main(int argc, char **argv)
int i;
pthread_create(®ister_thread, NULL, register_thread_main, NULL);
- for(i=0; i<1000000; i++) {
+ for(i = 0; i < 1000000; i++) {
tracepoint(hello_tptest, i);
}
diff --git a/tests/register_test/tp.h b/tests/register_test/tp.h
index ee5fd02..86d340c 100644
--- a/tests/register_test/tp.h
+++ b/tests/register_test/tp.h
@@ -1,4 +1,11 @@
-/* Copyright (C) 2009 Pierre-Marc Fournier
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM tp
+
+#if !defined(_TRACE_TP_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_TP_H
+
+/*
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,6 +24,17 @@
#include <ust/tracepoint.h>
-DECLARE_TRACEPOINT(hello_tptest,
- TP_PROTO(int anint),
- TP_ARGS(anint));
+TRACEPOINT_EVENT(hello_tptest,
+ TP_PROTO(int anint),
+ TP_ARGS(anint),
+ TP_FIELDS());
+
+#endif /* _TRACE_TP_H */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE tp
+
+/* This part must be outside protection */
+#include <ust/define_trace.h>
diff --git a/tests/trace_event/trace_event_test.c b/tests/trace_event/trace_event_test.c
index 8e87846..4c98c95 100644
--- a/tests/trace_event/trace_event_test.c
+++ b/tests/trace_event/trace_event_test.c
@@ -1,4 +1,6 @@
-/* Copyright (C) 2010 Nils Carlson <nils.carlson at ericsson.com>
+/*
+ * Copyright (C) 2010 Nils Carlson <nils.carlson at ericsson.com>
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -14,6 +16,7 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+
#include <stdio.h>
#include <ust/clock.h>
@@ -22,9 +25,10 @@
int main(int argc, char * argv[])
{
- static unsigned long time, i;
- for (i=0; i<10; i++) {
- time=trace_clock_read64();
+ unsigned long time, i;
+
+ for (i = 0; i < 10; i++) {
+ time = trace_clock_read64();
tracepoint(test, time, i);
}
return 0;
diff --git a/tests/trace_event/trace_event_test.h b/tests/trace_event/trace_event_test.h
index 38f0b46..3a126d4 100644
--- a/tests/trace_event/trace_event_test.h
+++ b/tests/trace_event/trace_event_test.h
@@ -1,4 +1,12 @@
-/* Copyright (C) 2010 Nils Carlson <nils.carlson at ericsson.com>
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM trace_event_test
+
+#if !defined(_TRACEPOINT_EVENT_TEST_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACEPOINT_EVENT_TEST_H
+
+/*
+ * Copyright (C) 2010 Nils Carlson <nils.carlson at ericsson.com>
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -14,11 +22,6 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#undef TRACE_SYSTEM
-#define TRACE_SYSTEM trace_event_test
-
-#if !defined(_TRACEPOINT_EVENT_TEST_H) || defined(TRACE_HEADER_MULTI_READ)
-#define _TRACEPOINT_EVENT_TEST_H
#include <ust/tracepoint.h>
@@ -28,17 +31,10 @@ TRACEPOINT_EVENT(test,
TP_ARGS(time, count),
- TP_STRUCT__entry(
- __field( unsigned long, time )
- __field( unsigned long, count )
- ),
-
- TP_fast_assign(
- __entry->time = time;
- __entry->count = count;
- ),
-
- TP_printf("time=%lu count=%lu", __entry->time, __entry->count)
+ TP_FIELDS(
+ tp_field(unsigned long, time, time)
+ tp_field(unsigned long, count, count)
+ )
);
#endif /* _TRACEPOINT_EVENT_TEST_H */
diff --git a/tests/tracepoint/benchmark/tracepoint_benchmark.c b/tests/tracepoint/benchmark/tracepoint_benchmark.c
index 50a1847..45f7d3c 100644
--- a/tests/tracepoint/benchmark/tracepoint_benchmark.c
+++ b/tests/tracepoint/benchmark/tracepoint_benchmark.c
@@ -25,13 +25,13 @@
*/
#include <stdio.h>
+
+#define TRACEPOINT_CREATE_PROBES
#include "tracepoint_benchmark.h"
#include <ust/type-serializer.h>
#define NR_EVENTS 10000000
-DEFINE_TRACEPOINT(ust_event);
-
void tp_probe(void *data, unsigned int p1);
DEFINE_UST_MARKER_TP(event, ust_event, tp_probe, "p1 %u");
@@ -49,7 +49,7 @@ void tp_probe(void *data, unsigned int p1)
static void __attribute__((constructor)) init()
{
- register_tracepoint(ust_event, tp_probe, NULL);
+ __register_tracepoint(ust_event, tp_probe, NULL);
}
void single_trace(unsigned int v)
diff --git a/tests/tracepoint/benchmark/tracepoint_benchmark.h b/tests/tracepoint/benchmark/tracepoint_benchmark.h
index f96f462..c5301d5 100644
--- a/tests/tracepoint/benchmark/tracepoint_benchmark.h
+++ b/tests/tracepoint/benchmark/tracepoint_benchmark.h
@@ -1,3 +1,40 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM tracepoint_benchmark
+
+#if !defined(_TRACE_TRACEPOINT_BENCHMARK_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_TRACEPOINT_BENCHMARK_H
+
+/*
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
#include <ust/tracepoint.h>
-DECLARE_TRACEPOINT(ust_event, TP_PROTO(unsigned int v), TP_ARGS(v));
+TRACEPOINT_EVENT(ust_event,
+ TP_PROTO(unsigned int v),
+ TP_ARGS(v),
+ TP_FIELDS());
+
+#endif /* _TRACE_TRACEPOINT_BENCHMARK_H */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE tracepoint_benchmark
+
+/* This part must be outside protection */
+#include <ust/define_trace.h>
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list