update: splitted reap_update_task()
Handle the DELETE and UPDATE events in separate callbacks: song_delete_event() safely deletes a song, and update_finished_event() is called when database update is complete.
This commit is contained in:
45
src/update.c
45
src/update.c
@@ -690,35 +690,48 @@ directory_update_init(char *path)
|
|||||||
return update_task_id;
|
return update_task_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reap_update_task(void)
|
/**
|
||||||
|
* Safely delete a song from the database. This must be done in the
|
||||||
|
* main task, to be sure that there is no pointer left to it.
|
||||||
|
*/
|
||||||
|
static void song_delete_event(void)
|
||||||
{
|
{
|
||||||
assert(g_thread_self() == main_task);
|
char *uri;
|
||||||
|
|
||||||
if (progress == UPDATE_PROGRESS_IDLE)
|
assert(progress == UPDATE_PROGRESS_RUNNING);
|
||||||
return;
|
assert(delete != NULL);
|
||||||
|
|
||||||
cond_enter(&delete_cond);
|
cond_enter(&delete_cond);
|
||||||
if (delete) {
|
|
||||||
char *tmp = song_get_uri(delete);
|
|
||||||
g_debug("removing: %s", tmp);
|
|
||||||
g_free(tmp);
|
|
||||||
|
|
||||||
deleteASongFromPlaylist(delete);
|
uri = song_get_uri(delete);
|
||||||
delete = NULL;
|
g_debug("removing: %s", uri);
|
||||||
cond_signal_sync(&delete_cond);
|
g_free(uri);
|
||||||
}
|
|
||||||
|
deleteASongFromPlaylist(delete);
|
||||||
|
delete = NULL;
|
||||||
|
|
||||||
|
cond_signal_sync(&delete_cond);
|
||||||
|
|
||||||
cond_leave(&delete_cond);
|
cond_leave(&delete_cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called in the main thread after the database update is finished.
|
||||||
|
*/
|
||||||
|
static void update_finished_event(void)
|
||||||
|
{
|
||||||
|
assert(progress == UPDATE_PROGRESS_DONE);
|
||||||
|
|
||||||
if (progress != UPDATE_PROGRESS_DONE)
|
|
||||||
return;
|
|
||||||
g_thread_join(update_thr);
|
g_thread_join(update_thr);
|
||||||
|
|
||||||
if (modified) {
|
if (modified) {
|
||||||
|
/* send "idle" events */
|
||||||
playlistVersionChange();
|
playlistVersionChange();
|
||||||
idle_add(IDLE_DATABASE);
|
idle_add(IDLE_DATABASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update_paths_nr) {
|
if (update_paths_nr) {
|
||||||
|
/* schedule the next path */
|
||||||
char *path = update_paths[0];
|
char *path = update_paths[0];
|
||||||
memmove(&update_paths[0], &update_paths[1],
|
memmove(&update_paths[0], &update_paths[1],
|
||||||
--update_paths_nr * sizeof(char *));
|
--update_paths_nr * sizeof(char *));
|
||||||
@@ -742,8 +755,8 @@ void update_global_init(void)
|
|||||||
|
|
||||||
cond_init(&delete_cond);
|
cond_init(&delete_cond);
|
||||||
|
|
||||||
event_pipe_register(PIPE_EVENT_DELETE, reap_update_task);
|
event_pipe_register(PIPE_EVENT_DELETE, song_delete_event);
|
||||||
event_pipe_register(PIPE_EVENT_UPDATE, reap_update_task);
|
event_pipe_register(PIPE_EVENT_UPDATE, update_finished_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_global_finish(void)
|
void update_global_finish(void)
|
||||||
|
Reference in New Issue
Block a user