diff options
Diffstat (limited to '')
-rw-r--r-- | src/idle.c | 27 | ||||
-rw-r--r-- | src/idle.h | 12 | ||||
-rw-r--r-- | src/main.c | 2 |
3 files changed, 35 insertions, 6 deletions
diff --git a/src/idle.c b/src/idle.c index 884086aae..4de252ada 100644 --- a/src/idle.c +++ b/src/idle.c @@ -25,10 +25,10 @@ #include "main_notify.h" #include <assert.h> -#include <pthread.h> +#include <glib.h> static unsigned idle_flags; -static pthread_mutex_t idle_mutex = PTHREAD_MUTEX_INITIALIZER; +static GMutex *idle_mutex = NULL; static const char *const idle_names[] = { "database", @@ -43,13 +43,28 @@ static const char *const idle_names[] = { }; void +idle_init(void) +{ + g_assert(idle_mutex == NULL); + idle_mutex = g_mutex_new(); +} + +void +idle_deinit(void) +{ + g_assert(idle_mutex != NULL); + g_mutex_free(idle_mutex); + idle_mutex = NULL; +} + +void idle_add(unsigned flags) { assert(flags != 0); - pthread_mutex_lock(&idle_mutex); + g_mutex_lock(idle_mutex); idle_flags |= flags; - pthread_mutex_unlock(&idle_mutex); + g_mutex_unlock(idle_mutex); wakeup_main_task(); } @@ -59,10 +74,10 @@ idle_get(void) { unsigned flags; - pthread_mutex_lock(&idle_mutex); + g_mutex_lock(idle_mutex); flags = idle_flags; idle_flags = 0; - pthread_mutex_unlock(&idle_mutex); + g_mutex_unlock(idle_mutex); return flags; } diff --git a/src/idle.h b/src/idle.h index 5079f09db..d65575ebe 100644 --- a/src/idle.h +++ b/src/idle.h @@ -49,6 +49,18 @@ enum { }; /** + * Initialize the mutex + */ +void +idle_init(void); + +/** + * Destroy the mutex + */ +void +idle_deinit(void); + +/** * Adds idle flag (with bitwise "or") and queues notifications to all * clients. */ diff --git a/src/main.c b/src/main.c index b64a07f22..e9f696bb0 100644 --- a/src/main.c +++ b/src/main.c @@ -268,6 +268,7 @@ int main(int argc, char *argv[]) /* enable GLib's thread safety code */ g_thread_init(NULL); + idle_init(); initConf(); parseOptions(argc, argv, &options); @@ -382,6 +383,7 @@ int main(int argc, char *argv[]) music_pipe_free(); cleanUpPidFile(); finishConf(); + idle_deinit(); close_log_files(); return EXIT_SUCCESS; |