#include "util/evlist.h"
 #include "util/evsel.h"
 #include "util/evsel_fprintf.h"
+#include "util/mutex.h"
 #include "util/symbol.h"
 #include "util/thread.h"
 #include "util/header.h"
        struct task_desc **pid_to_task;
        struct task_desc **tasks;
        const struct trace_sched_handler *tp_handler;
-       pthread_mutex_t  start_work_mutex;
-       pthread_mutex_t  work_done_wait_mutex;
+       struct mutex     start_work_mutex;
+       struct mutex     work_done_wait_mutex;
        int              profile_cpu;
 /*
  * Track the current task - that way we can know whether there's any
 again:
        ret = sem_post(&this_task->ready_for_work);
        BUG_ON(ret);
-       ret = pthread_mutex_lock(&sched->start_work_mutex);
-       BUG_ON(ret);
-       ret = pthread_mutex_unlock(&sched->start_work_mutex);
-       BUG_ON(ret);
+       mutex_lock(&sched->start_work_mutex);
+       mutex_unlock(&sched->start_work_mutex);
 
        cpu_usage_0 = get_cpu_usage_nsec_self(fd);
 
        ret = sem_post(&this_task->work_done_sem);
        BUG_ON(ret);
 
-       ret = pthread_mutex_lock(&sched->work_done_wait_mutex);
-       BUG_ON(ret);
-       ret = pthread_mutex_unlock(&sched->work_done_wait_mutex);
-       BUG_ON(ret);
+       mutex_lock(&sched->work_done_wait_mutex);
+       mutex_unlock(&sched->work_done_wait_mutex);
 
        goto again;
 }
        err = pthread_attr_setstacksize(&attr,
                        (size_t) max(16 * 1024, (int)PTHREAD_STACK_MIN));
        BUG_ON(err);
-       err = pthread_mutex_lock(&sched->start_work_mutex);
-       BUG_ON(err);
-       err = pthread_mutex_lock(&sched->work_done_wait_mutex);
-       BUG_ON(err);
+       mutex_lock(&sched->start_work_mutex);
+       mutex_lock(&sched->work_done_wait_mutex);
        for (i = 0; i < sched->nr_tasks; i++) {
                struct sched_thread_parms *parms = malloc(sizeof(*parms));
                BUG_ON(parms == NULL);
 
        sched->start_time = get_nsecs();
        sched->cpu_usage = 0;
-       pthread_mutex_unlock(&sched->work_done_wait_mutex);
+       mutex_unlock(&sched->work_done_wait_mutex);
 
        for (i = 0; i < sched->nr_tasks; i++) {
                task = sched->tasks[i];
                BUG_ON(ret);
                sem_init(&task->ready_for_work, 0, 0);
        }
-       ret = pthread_mutex_lock(&sched->work_done_wait_mutex);
-       BUG_ON(ret);
+       mutex_lock(&sched->work_done_wait_mutex);
 
        cpu_usage_0 = get_cpu_usage_nsec_parent();
 
-       pthread_mutex_unlock(&sched->start_work_mutex);
+       mutex_unlock(&sched->start_work_mutex);
 
        for (i = 0; i < sched->nr_tasks; i++) {
                task = sched->tasks[i];
        sched->runavg_parent_cpu_usage = (sched->runavg_parent_cpu_usage * (sched->replay_repeat - 1) +
                                         sched->parent_cpu_usage)/sched->replay_repeat;
 
-       ret = pthread_mutex_lock(&sched->start_work_mutex);
-       BUG_ON(ret);
+       mutex_lock(&sched->start_work_mutex);
 
        for (i = 0; i < sched->nr_tasks; i++) {
                task = sched->tasks[i];
                },
                .cmp_pid              = LIST_HEAD_INIT(sched.cmp_pid),
                .sort_list            = LIST_HEAD_INIT(sched.sort_list),
-               .start_work_mutex     = PTHREAD_MUTEX_INITIALIZER,
-               .work_done_wait_mutex = PTHREAD_MUTEX_INITIALIZER,
                .sort_order           = default_sort_order,
                .replay_repeat        = 10,
                .profile_cpu          = -1,
                .fork_event         = replay_fork_event,
        };
        unsigned int i;
-       int ret;
+       int ret = 0;
 
+       mutex_init(&sched.start_work_mutex);
+       mutex_init(&sched.work_done_wait_mutex);
        for (i = 0; i < ARRAY_SIZE(sched.curr_pid); i++)
                sched.curr_pid[i] = -1;
 
        /*
         * Aliased to 'perf script' for now:
         */
-       if (!strcmp(argv[0], "script"))
-               return cmd_script(argc, argv);
-
-       if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
-               return __cmd_record(argc, argv);
+       if (!strcmp(argv[0], "script")) {
+               ret = cmd_script(argc, argv);
+       } else if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
+               ret = __cmd_record(argc, argv);
        } else if (strlen(argv[0]) > 2 && strstarts("latency", argv[0])) {
                sched.tp_handler = &lat_ops;
                if (argc > 1) {
                                usage_with_options(latency_usage, latency_options);
                }
                setup_sorting(&sched, latency_options, latency_usage);
-               return perf_sched__lat(&sched);
+               ret = perf_sched__lat(&sched);
        } else if (!strcmp(argv[0], "map")) {
                if (argc) {
                        argc = parse_options(argc, argv, map_options, map_usage, 0);
                }
                sched.tp_handler = &map_ops;
                setup_sorting(&sched, latency_options, latency_usage);
-               return perf_sched__map(&sched);
+               ret = perf_sched__map(&sched);
        } else if (strlen(argv[0]) > 2 && strstarts("replay", argv[0])) {
                sched.tp_handler = &replay_ops;
                if (argc) {
                        if (argc)
                                usage_with_options(replay_usage, replay_options);
                }
-               return perf_sched__replay(&sched);
+               ret = perf_sched__replay(&sched);
        } else if (!strcmp(argv[0], "timehist")) {
                if (argc) {
                        argc = parse_options(argc, argv, timehist_options,
                                parse_options_usage(NULL, timehist_options, "w", true);
                        if (sched.show_next)
                                parse_options_usage(NULL, timehist_options, "n", true);
-                       return -EINVAL;
+                       ret = -EINVAL;
+                       goto out;
                }
                ret = symbol__validate_sym_arguments();
                if (ret)
-                       return ret;
+                       goto out;
 
-               return perf_sched__timehist(&sched);
+               ret = perf_sched__timehist(&sched);
        } else {
                usage_with_options(sched_usage, sched_options);
        }
 
-       return 0;
+out:
+       mutex_destroy(&sched.start_work_mutex);
+       mutex_destroy(&sched.work_done_wait_mutex);
+
+       return ret;
 }