X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libust%2Ftracepoint.c;h=f593306a83a8f7a784be2b7ca08393e5ee5294ee;hb=8d6300d3b3cb0219e1109e931a2219dbd812b24d;hp=ca40902494f61b9785a1e0b863852dca4694aff3;hpb=f218ff2821b494cf7b0fc3978e944070ad418772;p=ust.git diff --git a/libust/tracepoint.c b/libust/tracepoint.c index ca40902..f593306 100644 --- a/libust/tracepoint.c +++ b/libust/tracepoint.c @@ -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; }