@@ -83,6 +83,7 @@ static void metric_event_delete(struct rblist *rblist __maybe_unused,
83
83
struct metric_expr * expr , * tmp ;
84
84
85
85
list_for_each_entry_safe (expr , tmp , & me -> head , nd ) {
86
+ free (expr -> metric_refs );
86
87
free (expr );
87
88
}
88
89
@@ -248,6 +249,7 @@ static int metricgroup__setup_events(struct list_head *groups,
248
249
249
250
list_for_each_entry (eg , groups , nd ) {
250
251
struct evsel * * metric_events ;
252
+ struct metric_ref * metric_refs = NULL ;
251
253
252
254
metric_events = calloc (sizeof (void * ),
253
255
hashmap__size (& eg -> pctx .ids ) + 1 );
@@ -279,6 +281,36 @@ static int metricgroup__setup_events(struct list_head *groups,
279
281
free (metric_events );
280
282
break ;
281
283
}
284
+
285
+ /*
286
+ * Collect and store collected nested expressions
287
+ * for metric processing.
288
+ */
289
+ if (eg -> metric_refs_cnt ) {
290
+ struct metric_ref_node * ref ;
291
+
292
+ metric_refs = zalloc (sizeof (struct metric_ref ) * (eg -> metric_refs_cnt + 1 ));
293
+ if (!metric_refs ) {
294
+ ret = - ENOMEM ;
295
+ free (metric_events );
296
+ break ;
297
+ }
298
+
299
+ i = 0 ;
300
+ list_for_each_entry (ref , & eg -> metric_refs , list ) {
301
+ /*
302
+ * Intentionally passing just const char pointers,
303
+ * originally from 'struct pmu_event' object.
304
+ * We don't need to change them, so there's no
305
+ * need to create our own copy.
306
+ */
307
+ metric_refs [i ].metric_name = ref -> metric_name ;
308
+ metric_refs [i ].metric_expr = ref -> metric_expr ;
309
+ i ++ ;
310
+ }
311
+ };
312
+
313
+ expr -> metric_refs = metric_refs ;
282
314
expr -> metric_expr = eg -> metric_expr ;
283
315
expr -> metric_name = eg -> metric_name ;
284
316
expr -> metric_unit = eg -> metric_unit ;
0 commit comments