void ui_browser__show_title(struct ui_browser *browser, const char *title)
 {
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        __ui_browser__show_title(browser, title);
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
 }
 
 int ui_browser__show(struct ui_browser *browser, const char *title,
 
        browser->refresh_dimensions(browser);
 
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        __ui_browser__show_title(browser, title);
 
        browser->title = title;
        va_end(ap);
        if (err > 0)
                ui_helpline__push(browser->helpline);
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
        return err ? 0 : -1;
 }
 
 void ui_browser__hide(struct ui_browser *browser)
 {
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        ui_helpline__pop();
        zfree(&browser->helpline);
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
 }
 
 static void ui_browser__scrollbar_set(struct ui_browser *browser)
 
 int ui_browser__refresh(struct ui_browser *browser)
 {
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        __ui_browser__refresh(browser);
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
 
        return 0;
 }
        while (1) {
                off_t offset;
 
-               pthread_mutex_lock(&ui__lock);
+               mutex_lock(&ui__lock);
                err = __ui_browser__refresh(browser);
                SLsmg_refresh();
-               pthread_mutex_unlock(&ui__lock);
+               mutex_unlock(&ui__lock);
                if (err < 0)
                        break;
 
 
 #include "../../util/hist.h"
 #include "../../util/sort.h"
 #include "../../util/map.h"
+#include "../../util/mutex.h"
 #include "../../util/symbol.h"
 #include "../../util/evsel.h"
 #include "../../util/evlist.h"
 #include <inttypes.h>
-#include <pthread.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/zalloc.h>
 
 // SPDX-License-Identifier: GPL-2.0
-#include <pthread.h>
 #include <dlfcn.h>
 #include <unistd.h>
 
 #include "../util/hist.h"
 #include "ui.h"
 
-pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
+struct mutex ui__lock;
 void *perf_gtk_handle;
 int use_browser = -1;
 
 
 void setup_browser(bool fallback_to_pager)
 {
+       mutex_init(&ui__lock);
        if (use_browser < 2 && (!isatty(1) || dump_trace))
                use_browser = 0;
 
        default:
                break;
        }
+       mutex_destroy(&ui__lock);
 }
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <pthread.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 
        int ret;
        static int backlog;
 
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        ret = vscnprintf(ui_helpline__last_msg + backlog,
                        sizeof(ui_helpline__last_msg) - backlog, format, ap);
        backlog += ret;
                SLsmg_refresh();
                backlog = 0;
        }
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
 
        return ret;
 }
 
        }
 
        ui__refresh_dimensions(false);
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        y = SLtt_Screen_Rows / 2 - 2;
        SLsmg_set_color(0);
        SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols);
        bar = ((SLtt_Screen_Cols - 2) * p->curr) / p->total;
        SLsmg_fill_region(y, 1, 1, bar, ' ');
        SLsmg_refresh();
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
 }
 
 static void tui_progress__finish(void)
                return;
 
        ui__refresh_dimensions(false);
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        y = SLtt_Screen_Rows / 2 - 2;
        SLsmg_set_color(0);
        SLsmg_fill_region(y, 0, 3, SLtt_Screen_Cols, ' ');
        SLsmg_refresh();
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
 }
 
 static struct ui_progress_ops tui_progress__ops = {
 
 {
        if (force || ui__need_resize) {
                ui__need_resize = 0;
-               pthread_mutex_lock(&ui__lock);
+               mutex_lock(&ui__lock);
                SLtt_get_screen_size();
                SLsmg_reinit_smg();
-               pthread_mutex_unlock(&ui__lock);
+               mutex_unlock(&ui__lock);
        }
 }
 
                                    "Press any key...", 0);
 
        SLtt_set_cursor_visibility(1);
-       if (!pthread_mutex_trylock(&ui__lock)) {
+       if (mutex_trylock(&ui__lock)) {
                SLsmg_refresh();
                SLsmg_reset_smg();
-               pthread_mutex_unlock(&ui__lock);
+               mutex_unlock(&ui__lock);
        }
        SLang_reset_tty();
        perf_error__unregister(&perf_tui_eops);
 
                t = sep + 1;
        }
 
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
 
        max_len += 2;
        nr_lines += 8;
        SLsmg_write_nstring((char *)exit_msg, max_len);
        SLsmg_refresh();
 
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
 
        x += 2;
        len = 0;
        key = ui__getch(delay_secs);
        while (key != K_TIMER && key != K_ENTER && key != K_ESC) {
-               pthread_mutex_lock(&ui__lock);
+               mutex_lock(&ui__lock);
 
                if (key == K_BKSPC) {
                        if (len == 0) {
-                               pthread_mutex_unlock(&ui__lock);
+                               mutex_unlock(&ui__lock);
                                goto next_key;
                        }
                        SLsmg_gotorc(y, x + --len);
                }
                SLsmg_refresh();
 
-               pthread_mutex_unlock(&ui__lock);
+               mutex_unlock(&ui__lock);
 
                /* XXX more graceful overflow handling needed */
                if (len == sizeof(buf) - 1) {
 
 void ui__info_window(const char *title, const char *text)
 {
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        __ui__info_window(title, text, NULL);
        SLsmg_refresh();
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
 }
 
 int ui__question_window(const char *title, const char *text,
                        const char *exit_msg, int delay_secs)
 {
-       pthread_mutex_lock(&ui__lock);
+       mutex_lock(&ui__lock);
        __ui__info_window(title, text, exit_msg);
        SLsmg_refresh();
-       pthread_mutex_unlock(&ui__lock);
+       mutex_unlock(&ui__lock);
        return ui__getch(delay_secs);
 }
 
 
 #ifndef _PERF_UI_H_
 #define _PERF_UI_H_ 1
 
-#include <pthread.h>
+#include "../util/mutex.h"
 #include <stdbool.h>
 #include <linux/compiler.h>
 
-extern pthread_mutex_t ui__lock;
+extern struct mutex ui__lock;
 extern void *perf_gtk_handle;
 
 extern int use_browser;