pthread_mutex_lock(&markers_mutex);
for (iter = begin; iter < end; iter++) {
+ if (!*iter)
+ continue; /* skip dummy */
mark_entry = get_marker((*iter)->channel, (*iter)->name);
if (mark_entry) {
set_marker(mark_entry, *iter, !!mark_entry->refcount);
struct marker * const *begin,
struct marker * const *end)
{
- if (!*marker && begin != end) {
+ if (!*marker && begin != end)
*marker = begin;
- return 1;
+ while (*marker >= begin && *marker < end) {
+ if (!**marker)
+ (*marker)++; /* skip dummy */
+ else
+ return 1;
}
- if (*marker >= begin && *marker < end)
- return 1;
return 0;
}
//ust// EXPORT_SYMBOL_GPL(marker_get_iter_range);
{
if (new_marker_cb) {
struct marker * const *m;
- for(m=start; m < end; m++) {
- new_marker_cb(*m);
+
+ for(m = start; m < end; m++) {
+ if (*m)
+ new_marker_cb(*m);
}
}
}
int marker_register_lib(struct marker * const *markers_start, int markers_count)
{
- struct lib *pl;
+ struct lib *pl, *iter;
pl = (struct lib *) zmalloc(sizeof(struct lib));
/* FIXME: maybe protect this with its own mutex? */
lock_markers();
+
+ /*
+ * 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:
unlock_markers();
new_markers(markers_start, markers_start + markers_count);
/* FIXME: update just the loaded lib */
lib_update_markers();
- DBG("just registered a markers section from %p and having %d markers", markers_start, markers_count);
+ DBG("just registered a markers section from %p and having %d markers (minus dummy markers)", markers_start, markers_count);
return 0;
}
}
}
-void __attribute__((constructor)) destroy_markers(void)
+void __attribute__((destructor)) destroy_markers(void)
{
marker_unregister_lib(__start___markers_ptrs);
}