TRACEPOINT_EVENT: standardize locking wrt tracepoints and markers
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 20 May 2011 17:22:08 +0000 (13:22 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 20 May 2011 17:22:08 +0000 (13:22 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/ust/tracepoint-internal.h
libust/trace_event.c
libust/tracectl.c

index 6b159b4c09378f6c44c35250f4208457452da451..83ea68de8b76a12c4f52aadfc1bc807e671c9dfe 100644 (file)
@@ -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);
 
index 6b30b68642dae769326d95f3691874e4f4d5c839..854a7676b3586d10b84ece785eb97cb65f2aec3d 100644 (file)
 
 /* 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;
 }
index ef7184fe7787696764088a82e56e0adf28661d90..771e4e1f6c86540cd1a478b2b0abde8c98d90b96 100644 (file)
@@ -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)
This page took 0.02845 seconds and 4 git commands to generate.