[ltt-dev] [UST commit] TRACEPOINT_EVENT: standardize locking wrt tracepoints and markers
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Fri May 20 13:21:52 EDT 2011
commit c72922954e8622cea2d1b8338bb286c15c0b1104
Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Date: Fri May 20 13:22:08 2011 -0400
TRACEPOINT_EVENT: standardize locking wrt tracepoints and markers
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
diff --git a/include/ust/tracepoint-internal.h b/include/ust/tracepoint-internal.h
index 6b159b4..83ea68d 100644
--- a/include/ust/tracepoint-internal.h
+++ b/include/ust/tracepoint-internal.h
@@ -62,9 +62,6 @@ 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;
@@ -72,12 +69,9 @@ struct trace_event_iter {
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_stop(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);
diff --git a/libust/trace_event.c b/libust/trace_event.c
index 6b30b68..854a767 100644
--- a/libust/trace_event.c
+++ b/libust/trace_event.c
@@ -29,20 +29,33 @@
/* libraries that contain trace_events (struct trace_event_lib) */
static CDS_LIST_HEAD(libs);
-
+/*
+ * Nested mutex is not required here, but provide the same guaranteed
+ * for start/stop iteration vs nested ops as markers and tracepoints.
+ */
+static __thread int nested_mutex;
static DEFINE_MUTEX(trace_events_mutex);
+static
+int trace_event_get_iter_range(struct trace_event * const **trace_event,
+ struct trace_event * const *begin,
+ struct trace_event * const *end);
+
+static
void lock_trace_events(void)
{
- pthread_mutex_lock(&trace_events_mutex);
+ if (!(nested_mutex++))
+ pthread_mutex_lock(&trace_events_mutex);
}
+static
void unlock_trace_events(void)
{
- pthread_mutex_unlock(&trace_events_mutex);
+ if (!(--nested_mutex))
+ pthread_mutex_unlock(&trace_events_mutex);
}
-
+static
int lib_get_iter_trace_events(struct trace_event_iter *iter)
{
struct trace_event_lib *iter_lib;
@@ -72,7 +85,9 @@ int lib_get_iter_trace_events(struct trace_event_iter *iter)
*
* Returns whether a next trace_event has been found (1) or not (0).
* Will return the first trace_event in the range if the input trace_event is NULL.
+ * Called with trace event mutex held.
*/
+static
int trace_event_get_iter_range(struct trace_event * const **trace_event,
struct trace_event * const *begin,
struct trace_event * const *end)
@@ -100,9 +115,13 @@ static void trace_event_get_iter(struct trace_event_iter *iter)
void trace_event_iter_start(struct trace_event_iter *iter)
{
+ lock_trace_events();
trace_event_get_iter(iter);
}
+/*
+ * Called with trace event mutex held.
+ */
void trace_event_iter_next(struct trace_event_iter *iter)
{
iter->trace_event++;
@@ -114,6 +133,11 @@ void trace_event_iter_next(struct trace_event_iter *iter)
trace_event_get_iter(iter);
}
+void trace_event_iter_stop(struct trace_event_iter *iter)
+{
+ unlock_trace_events();
+}
+
void trace_event_iter_reset(struct trace_event_iter *iter)
{
iter->lib = NULL;
@@ -130,8 +154,7 @@ int trace_event_register_lib(struct trace_event * const *trace_events_start,
pl->trace_events_start = trace_events_start;
pl->trace_events_count = trace_events_count;
- /* FIXME: maybe protect this with its own mutex? */
- pthread_mutex_lock(&trace_events_mutex);
+ lock_trace_events();
/*
* We sort the libs by struct lib pointer address.
*/
@@ -146,7 +169,7 @@ int trace_event_register_lib(struct trace_event * const *trace_events_start,
/* We should be added at the head of the list */
cds_list_add(&pl->list, &libs);
lib_added:
- pthread_mutex_unlock(&trace_events_mutex);
+ unlock_trace_events();
/* trace_events_count - 1: skip dummy */
DBG("just registered a trace_events section from %p and having %d trace_events (minus dummy trace_event)", trace_events_start, trace_events_count);
@@ -158,8 +181,7 @@ int trace_event_unregister_lib(struct trace_event * const *trace_events_start)
{
struct trace_event_lib *lib;
- pthread_mutex_lock(&trace_events_mutex);
-
+ unlock_trace_events();
cds_list_for_each_entry(lib, &libs, list) {
if(lib->trace_events_start == trace_events_start) {
struct trace_event_lib *lib2free = lib;
@@ -168,8 +190,7 @@ int trace_event_unregister_lib(struct trace_event * const *trace_events_start)
break;
}
}
-
- pthread_mutex_unlock(&trace_events_mutex);
+ unlock_trace_events();
return 0;
}
diff --git a/libust/tracectl.c b/libust/tracectl.c
index ef7184f..771e4e1 100644
--- a/libust/tracectl.c
+++ b/libust/tracectl.c
@@ -126,7 +126,6 @@ static void print_trace_events(FILE *fp)
{
struct trace_event_iter iter;
- lock_trace_events();
trace_event_iter_reset(&iter);
trace_event_iter_start(&iter);
@@ -134,7 +133,7 @@ static void print_trace_events(FILE *fp)
fprintf(fp, "trace_event: %s\n", (*iter.trace_event)->name);
trace_event_iter_next(&iter);
}
- unlock_trace_events();
+ trace_event_iter_stop(&iter);
}
static int connect_ustconsumer(void)
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list