return r->last_time[cpu];
 }
 
+static void timehist__evsel_priv_destructor(void *priv)
+{
+       struct evsel_runtime *r = priv;
+
+       if (r) {
+               free(r->last_time);
+               free(r);
+       }
+}
+
 static int comm_width = 30;
 
 static char *timehist_get_commstr(struct thread *thread)
 
        setup_pager();
 
+       evsel__set_priv_destructor(timehist__evsel_priv_destructor);
+
        /* prefer sched_waking if it is captured */
        if (evlist__find_tracepoint_by_name(session->evlist, "sched:sched_waking"))
                handlers[1].handler = timehist_sched_wakeup_ignore;
 
        free_config_terms(&evsel->config_terms);
 }
 
+static void (*evsel__priv_destructor)(void *priv);
+
+void evsel__set_priv_destructor(void (*destructor)(void *priv))
+{
+       assert(evsel__priv_destructor == NULL);
+
+       evsel__priv_destructor = destructor;
+}
+
 void evsel__exit(struct evsel *evsel)
 {
        assert(list_empty(&evsel->core.node));
        hashmap__free(evsel->per_pkg_mask);
        evsel->per_pkg_mask = NULL;
        zfree(&evsel->metric_events);
+       if (evsel__priv_destructor)
+               evsel__priv_destructor(evsel->priv);
        perf_evsel__object.fini(evsel);
        if (evsel__tool_event(evsel) == TOOL_PMU__EVENT_SYSTEM_TIME ||
            evsel__tool_event(evsel) == TOOL_PMU__EVENT_USER_TIME)
 
 void evsel__exit(struct evsel *evsel);
 void evsel__delete(struct evsel *evsel);
 
+void evsel__set_priv_destructor(void (*destructor)(void *priv));
+
 struct callchain_param;
 
 void evsel__config(struct evsel *evsel, struct record_opts *opts,