Commit 1025f0be authored by Max Kellermann's avatar Max Kellermann

update_remove: use plain GCond instead of notify

GMutex/GCond guarantee that the access to removed_song is protected.
parent 77d3b5e8
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include "config.h" /* must be first for large file support */ #include "config.h" /* must be first for large file support */
#include "update_internal.h" #include "update_internal.h"
#include "notify.h"
#include "event_pipe.h" #include "event_pipe.h"
#include "song.h" #include "song.h"
#include "playlist.h" #include "playlist.h"
...@@ -36,7 +35,8 @@ ...@@ -36,7 +35,8 @@
static const struct song *removed_song; static const struct song *removed_song;
static struct notify remove_notify; static GMutex *remove_mutex;
static GCond *remove_cond;
/** /**
* Safely remove a song from the database. This must be done in the * Safely remove a song from the database. This must be done in the
...@@ -60,15 +60,19 @@ song_remove_event(void) ...@@ -60,15 +60,19 @@ song_remove_event(void)
#endif #endif
playlist_delete_song(&g_playlist, global_player_control, removed_song); playlist_delete_song(&g_playlist, global_player_control, removed_song);
removed_song = NULL;
notify_signal(&remove_notify); /* clear "removed_song" and send signal to update thread */
g_mutex_lock(remove_mutex);
removed_song = NULL;
g_cond_signal(remove_cond);
g_mutex_unlock(remove_mutex);
} }
void void
update_remove_global_init(void) update_remove_global_init(void)
{ {
notify_init(&remove_notify); remove_mutex = g_mutex_new();
remove_cond = g_cond_new();
event_pipe_register(PIPE_EVENT_DELETE, song_remove_event); event_pipe_register(PIPE_EVENT_DELETE, song_remove_event);
} }
...@@ -76,7 +80,8 @@ update_remove_global_init(void) ...@@ -76,7 +80,8 @@ update_remove_global_init(void)
void void
update_remove_global_finish(void) update_remove_global_finish(void)
{ {
notify_deinit(&remove_notify); g_mutex_free(remove_mutex);
g_cond_free(remove_cond);
} }
void void
...@@ -88,8 +93,10 @@ update_remove_song(const struct song *song) ...@@ -88,8 +93,10 @@ update_remove_song(const struct song *song)
event_pipe_emit(PIPE_EVENT_DELETE); event_pipe_emit(PIPE_EVENT_DELETE);
do { g_mutex_lock(remove_mutex);
notify_wait(&remove_notify);
} while (removed_song != NULL); while (removed_song != NULL)
g_cond_wait(remove_cond, remove_mutex);
g_mutex_unlock(remove_mutex);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment