aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib/traceevent
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lib/traceevent')
-rw-r--r--tools/lib/traceevent/event-parse.c109
-rw-r--r--tools/lib/traceevent/event-parse.h5
2 files changed, 91 insertions, 23 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index 666e23ded6ed..c00aebab3c33 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -5651,32 +5651,26 @@ static int events_system_cmp(const void *a, const void *b)
5651 return events_id_cmp(a, b); 5651 return events_id_cmp(a, b);
5652} 5652}
5653 5653
5654struct tep_event **tep_list_events(struct tep_handle *pevent, enum tep_event_sort_type sort_type) 5654static struct tep_event **list_events_copy(struct tep_handle *tep)
5655{ 5655{
5656 struct tep_event **events; 5656 struct tep_event **events;
5657 int (*sort)(const void *a, const void *b);
5658
5659 events = pevent->sort_events;
5660
5661 if (events && pevent->last_type == sort_type)
5662 return events;
5663 5657
5664 if (!events) { 5658 if (!tep)
5665 events = malloc(sizeof(*events) * (pevent->nr_events + 1)); 5659 return NULL;
5666 if (!events)
5667 return NULL;
5668 5660
5669 memcpy(events, pevent->events, sizeof(*events) * pevent->nr_events); 5661 events = malloc(sizeof(*events) * (tep->nr_events + 1));
5670 events[pevent->nr_events] = NULL; 5662 if (!events)
5663 return NULL;
5671 5664
5672 pevent->sort_events = events; 5665 memcpy(events, tep->events, sizeof(*events) * tep->nr_events);
5666 events[tep->nr_events] = NULL;
5667 return events;
5668}
5673 5669
5674 /* the internal events are sorted by id */ 5670static void list_events_sort(struct tep_event **events, int nr_events,
5675 if (sort_type == TEP_EVENT_SORT_ID) { 5671 enum tep_event_sort_type sort_type)
5676 pevent->last_type = sort_type; 5672{
5677 return events; 5673 int (*sort)(const void *a, const void *b);
5678 }
5679 }
5680 5674
5681 switch (sort_type) { 5675 switch (sort_type) {
5682 case TEP_EVENT_SORT_ID: 5676 case TEP_EVENT_SORT_ID:
@@ -5689,11 +5683,82 @@ struct tep_event **tep_list_events(struct tep_handle *pevent, enum tep_event_sor
5689 sort = events_system_cmp; 5683 sort = events_system_cmp;
5690 break; 5684 break;
5691 default: 5685 default:
5686 sort = NULL;
5687 }
5688
5689 if (sort)
5690 qsort(events, nr_events, sizeof(*events), sort);
5691}
5692
5693/**
5694 * tep_list_events - Get events, sorted by given criteria.
5695 * @tep: a handle to the tep context
5696 * @sort_type: desired sort order of the events in the array
5697 *
5698 * Returns an array of pointers to all events, sorted by the given
5699 * @sort_type criteria. The last element of the array is NULL. The returned
5700 * memory must not be freed, it is managed by the library.
5701 * The function is not thread safe.
5702 */
5703struct tep_event **tep_list_events(struct tep_handle *tep,
5704 enum tep_event_sort_type sort_type)
5705{
5706 struct tep_event **events;
5707
5708 if (!tep)
5709 return NULL;
5710
5711 events = tep->sort_events;
5712 if (events && tep->last_type == sort_type)
5692 return events; 5713 return events;
5714
5715 if (!events) {
5716 events = list_events_copy(tep);
5717 if (!events)
5718 return NULL;
5719
5720 tep->sort_events = events;
5721
5722 /* the internal events are sorted by id */
5723 if (sort_type == TEP_EVENT_SORT_ID) {
5724 tep->last_type = sort_type;
5725 return events;
5726 }
5693 } 5727 }
5694 5728
5695 qsort(events, pevent->nr_events, sizeof(*events), sort); 5729 list_events_sort(events, tep->nr_events, sort_type);
5696 pevent->last_type = sort_type; 5730 tep->last_type = sort_type;
5731
5732 return events;
5733}
5734
5735
5736/**
5737 * tep_list_events_copy - Thread safe version of tep_list_events()
5738 * @tep: a handle to the tep context
5739 * @sort_type: desired sort order of the events in the array
5740 *
5741 * Returns an array of pointers to all events, sorted by the given
5742 * @sort_type criteria. The last element of the array is NULL. The returned
5743 * array is newly allocated inside the function and must be freed by the caller
5744 */
5745struct tep_event **tep_list_events_copy(struct tep_handle *tep,
5746 enum tep_event_sort_type sort_type)
5747{
5748 struct tep_event **events;
5749
5750 if (!tep)
5751 return NULL;
5752
5753 events = list_events_copy(tep);
5754 if (!events)
5755 return NULL;
5756
5757 /* the internal events are sorted by id */
5758 if (sort_type == TEP_EVENT_SORT_ID)
5759 return events;
5760
5761 list_events_sort(events, tep->nr_events, sort_type);
5697 5762
5698 return events; 5763 return events;
5699} 5764}
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index aec48f2aea8a..41159358abc2 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -544,7 +544,10 @@ void tep_event_info(struct trace_seq *s, struct tep_event *event,
544int tep_strerror(struct tep_handle *pevent, enum tep_errno errnum, 544int tep_strerror(struct tep_handle *pevent, enum tep_errno errnum,
545 char *buf, size_t buflen); 545 char *buf, size_t buflen);
546 546
547struct tep_event **tep_list_events(struct tep_handle *pevent, enum tep_event_sort_type); 547struct tep_event **tep_list_events(struct tep_handle *tep,
548 enum tep_event_sort_type);
549struct tep_event **tep_list_events_copy(struct tep_handle *tep,
550 enum tep_event_sort_type);
548struct tep_format_field **tep_event_common_fields(struct tep_event *event); 551struct tep_format_field **tep_event_common_fields(struct tep_event *event);
549struct tep_format_field **tep_event_fields(struct tep_event *event); 552struct tep_format_field **tep_event_fields(struct tep_event *event);
550 553