@@ -3285,15 +3285,20 @@ static int perf_sched__map(struct perf_sched *sched)
32853285
32863286static int perf_sched__replay (struct perf_sched * sched )
32873287{
3288+ int ret ;
32883289 unsigned long i ;
32893290
3291+ mutex_init (& sched -> start_work_mutex );
3292+ mutex_init (& sched -> work_done_wait_mutex );
3293+
32903294 calibrate_run_measurement_overhead (sched );
32913295 calibrate_sleep_measurement_overhead (sched );
32923296
32933297 test_calibrations (sched );
32943298
3295- if (perf_sched__read_events (sched ))
3296- return -1 ;
3299+ ret = perf_sched__read_events (sched );
3300+ if (ret )
3301+ goto out_mutex_destroy ;
32973302
32983303 printf ("nr_run_events: %ld\n" , sched -> nr_run_events );
32993304 printf ("nr_sleep_events: %ld\n" , sched -> nr_sleep_events );
@@ -3318,7 +3323,11 @@ static int perf_sched__replay(struct perf_sched *sched)
33183323
33193324 sched -> thread_funcs_exit = true;
33203325 destroy_tasks (sched );
3321- return 0 ;
3326+
3327+ out_mutex_destroy :
3328+ mutex_destroy (& sched -> start_work_mutex );
3329+ mutex_destroy (& sched -> work_done_wait_mutex );
3330+ return ret ;
33223331}
33233332
33243333static void setup_sorting (struct perf_sched * sched , const struct option * options ,
@@ -3556,8 +3565,6 @@ int cmd_sched(int argc, const char **argv)
35563565 unsigned int i ;
35573566 int ret = 0 ;
35583567
3559- mutex_init (& sched .start_work_mutex );
3560- mutex_init (& sched .work_done_wait_mutex );
35613568 sched .curr_thread = calloc (MAX_CPUS , sizeof (* sched .curr_thread ));
35623569 if (!sched .curr_thread ) {
35633570 ret = - ENOMEM ;
@@ -3645,8 +3652,6 @@ int cmd_sched(int argc, const char **argv)
36453652 free (sched .curr_pid );
36463653 free (sched .cpu_last_switched );
36473654 free (sched .curr_thread );
3648- mutex_destroy (& sched .start_work_mutex );
3649- mutex_destroy (& sched .work_done_wait_mutex );
36503655
36513656 return ret ;
36523657}
0 commit comments