libust: New transport mutex v2
[ust.git] / libust / tracepoint.c
index ca40902494f61b9785a1e0b863852dca4694aff3..f593306a83a8f7a784be2b7ca08393e5ee5294ee 100644 (file)
@@ -295,6 +295,8 @@ void tracepoint_update_probe_range(struct tracepoint * const *begin,
 
        pthread_mutex_lock(&tracepoints_mutex);
        for (iter = begin; iter < end; iter++) {
+               if (!*iter)
+                       continue;       /* skip dummy */
                if (!(*iter)->name) {
                        disable_tracepoint(*iter);
                        continue;
@@ -550,12 +552,14 @@ int lib_get_iter_tracepoints(struct tracepoint_iter *iter)
 int tracepoint_get_iter_range(struct tracepoint * const **tracepoint,
        struct tracepoint * const *begin, struct tracepoint * const *end)
 {
-       if (!*tracepoint && begin != end) {
+       if (!*tracepoint && begin != end)
                *tracepoint = begin;
-               return 1;
+       while (*tracepoint >= begin && *tracepoint < end) {
+               if (!**tracepoint)
+                       (*tracepoint)++;        /* skip dummy */
+               else
+                       return 1;
        }
-       if (*tracepoint >= begin && *tracepoint < end)
-               return 1;
        return 0;
 }
 //ust// EXPORT_SYMBOL_GPL(tracepoint_get_iter_range);
@@ -652,15 +656,17 @@ static void new_tracepoints(struct tracepoint * const *start, struct tracepoint
 {
        if (new_tracepoint_cb) {
                struct tracepoint * const *t;
-               for(t=start; t < end; t++) {
-                       new_tracepoint_cb(*t);
+
+               for(t = start; t < end; t++) {
+                       if (*t)
+                               new_tracepoint_cb(*t);
                }
        }
 }
 
 int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, int tracepoints_count)
 {
-       struct tracepoint_lib *pl;
+       struct tracepoint_lib *pl, *iter;
 
        pl = (struct tracepoint_lib *) zmalloc(sizeof(struct tracepoint_lib));
 
@@ -669,7 +675,20 @@ int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, int tr
 
        /* FIXME: maybe protect this with its own mutex? */
        pthread_mutex_lock(&tracepoints_mutex);
+       /*
+        * We sort the libs by struct lib pointer address.
+        */
+       cds_list_for_each_entry_reverse(iter, &libs, list) {
+               BUG_ON(iter == pl);    /* Should never be in the list twice */
+               if (iter < pl) {
+                       /* We belong to the location right after iter. */
+                       cds_list_add(&pl->list, &iter->list);
+                       goto lib_added;
+               }
+       }
+       /* We should be added at the head of the list */
        cds_list_add(&pl->list, &libs);
+lib_added:
        pthread_mutex_unlock(&tracepoints_mutex);
 
        new_tracepoints(tracepoints_start, tracepoints_start + tracepoints_count);
@@ -677,7 +696,8 @@ int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, int tr
        /* FIXME: update just the loaded lib */
        lib_update_tracepoints();
 
-       DBG("just registered a tracepoints section from %p and having %d tracepoints", tracepoints_start, tracepoints_count);
+       /* tracepoints_count - 1: skip dummy */
+       DBG("just registered a tracepoints section from %p and having %d tracepoints (minus dummy tracepoints)", tracepoints_start, tracepoints_count);
 
        return 0;
 }
This page took 0.024625 seconds and 4 git commands to generate.