@@ -879,6 +879,10 @@ struct metricgroup_add_iter_data {
879
879
const struct pmu_events_table * table ;
880
880
};
881
881
882
+ static bool metricgroup__find_metric (const char * metric ,
883
+ const struct pmu_events_table * table ,
884
+ struct pmu_event * pe );
885
+
882
886
static int add_metric (struct list_head * metric_list ,
883
887
const struct pmu_event * pe ,
884
888
const char * modifier ,
@@ -914,7 +918,7 @@ static int resolve_metric(struct list_head *metric_list,
914
918
size_t bkt ;
915
919
struct to_resolve {
916
920
/* The metric to resolve. */
917
- const struct pmu_event * pe ;
921
+ struct pmu_event pe ;
918
922
/*
919
923
* The key in the IDs map, this may differ from in case,
920
924
* etc. from pe->metric_name.
@@ -928,16 +932,15 @@ static int resolve_metric(struct list_head *metric_list,
928
932
* the pending array.
929
933
*/
930
934
hashmap__for_each_entry (root_metric -> pctx -> ids , cur , bkt ) {
931
- const struct pmu_event * pe ;
935
+ struct pmu_event pe ;
932
936
933
- pe = metricgroup__find_metric (cur -> key , table );
934
- if (pe ) {
937
+ if (metricgroup__find_metric (cur -> key , table , & pe )) {
935
938
pending = realloc (pending ,
936
939
(pending_cnt + 1 ) * sizeof (struct to_resolve ));
937
940
if (!pending )
938
941
return - ENOMEM ;
939
942
940
- pending [pending_cnt ].pe = pe ;
943
+ memcpy ( & pending [pending_cnt ].pe , & pe , sizeof ( pe )) ;
941
944
pending [pending_cnt ].key = cur -> key ;
942
945
pending_cnt ++ ;
943
946
}
@@ -952,7 +955,7 @@ static int resolve_metric(struct list_head *metric_list,
952
955
* context.
953
956
*/
954
957
for (i = 0 ; i < pending_cnt ; i ++ ) {
955
- ret = add_metric (metric_list , pending [i ].pe , modifier , metric_no_group ,
958
+ ret = add_metric (metric_list , & pending [i ].pe , modifier , metric_no_group ,
956
959
root_metric , visited , table );
957
960
if (ret )
958
961
break ;
@@ -1073,7 +1076,7 @@ static int __add_metric(struct list_head *metric_list,
1073
1076
1074
1077
struct metricgroup__find_metric_data {
1075
1078
const char * metric ;
1076
- const struct pmu_event * pe ;
1079
+ struct pmu_event * pe ;
1077
1080
};
1078
1081
1079
1082
static int metricgroup__find_metric_callback (const struct pmu_event * pe ,
@@ -1085,21 +1088,21 @@ static int metricgroup__find_metric_callback(const struct pmu_event *pe,
1085
1088
if (!match_metric (pe -> metric_name , data -> metric ))
1086
1089
return 0 ;
1087
1090
1088
- data -> pe = pe ;
1089
- return - 1 ;
1091
+ memcpy ( data -> pe , pe , sizeof ( * pe )) ;
1092
+ return 1 ;
1090
1093
}
1091
1094
1092
- const struct pmu_event * metricgroup__find_metric (const char * metric ,
1093
- const struct pmu_events_table * table )
1095
+ static bool metricgroup__find_metric (const char * metric ,
1096
+ const struct pmu_events_table * table ,
1097
+ struct pmu_event * pe )
1094
1098
{
1095
1099
struct metricgroup__find_metric_data data = {
1096
1100
.metric = metric ,
1097
- .pe = NULL ,
1101
+ .pe = pe ,
1098
1102
};
1099
1103
1100
- pmu_events_table_for_each_event (table , metricgroup__find_metric_callback , & data );
1101
-
1102
- return data .pe ;
1104
+ return pmu_events_table_for_each_event (table , metricgroup__find_metric_callback , & data )
1105
+ ? true : false;
1103
1106
}
1104
1107
1105
1108
static int add_metric (struct list_head * metric_list ,
0 commit comments