diff options
author | Max Kellermann <max@duempel.org> | 2013-10-17 21:30:49 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-10-17 21:45:42 +0200 |
commit | 0c63632cc2354e662da67453043a039efb65ae28 (patch) | |
tree | 3d860265603afa682494cedaf6e69fbfc29af5dd /src/UpdateGlue.cxx | |
parent | b93523c0b1009f7ff3e6f1629ad11ab7594333fb (diff) | |
download | mpd-0c63632cc2354e662da67453043a039efb65ae28.tar.gz mpd-0c63632cc2354e662da67453043a039efb65ae28.tar.xz mpd-0c63632cc2354e662da67453043a039efb65ae28.zip |
UpdateGlue: pass UpdateQueueItem around
Fixes a few kludges and avoids GLib allocation.
Diffstat (limited to '')
-rw-r--r-- | src/UpdateGlue.cxx | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/src/UpdateGlue.cxx b/src/UpdateGlue.cxx index 663b996b5..5eebe4e77 100644 --- a/src/UpdateGlue.cxx +++ b/src/UpdateGlue.cxx @@ -36,8 +36,6 @@ #include "thread/Id.hxx" #include "thread/Thread.hxx" -#include <glib.h> - #include <assert.h> static enum update_progress { @@ -54,8 +52,7 @@ static const unsigned update_task_id_max = 1 << 15; static unsigned update_task_id; -/* XXX this flag is passed to update_task() */ -static bool discard; +static UpdateQueueItem next; unsigned isUpdatingDB(void) @@ -64,16 +61,15 @@ isUpdatingDB(void) } static void -update_task(void *_path) +update_task(gcc_unused void *ctx) { - const char *path = (const char *)_path; - - if (path != NULL && *path != 0) - FormatDebug(update_domain, "starting: %s", path); + if (!next.path_utf8.empty()) + FormatDebug(update_domain, "starting: %s", + next.path_utf8.c_str()); else LogDebug(update_domain, "starting"); - modified = update_walk(path, discard); + modified = update_walk(next.path_utf8.c_str(), next.discard); if (modified || !db_exists()) { Error error; @@ -81,26 +77,28 @@ update_task(void *_path) LogError(error, "Failed to save database"); } - if (path != NULL && *path != 0) - FormatDebug(update_domain, "finished: %s", path); + if (!next.path_utf8.empty()) + FormatDebug(update_domain, "finished: %s", + next.path_utf8.c_str()); else LogDebug(update_domain, "finished"); - g_free(_path); progress = UPDATE_PROGRESS_DONE; GlobalEvents::Emit(GlobalEvents::UPDATE); } static void -spawn_update_task(const char *path) +spawn_update_task(UpdateQueueItem &&i) { assert(main_thread.IsInside()); progress = UPDATE_PROGRESS_RUNNING; modified = false; + next = std::move(i); + Error error; - if (!update_thread.Start(update_task, g_strdup(path), error)) + if (!update_thread.Start(update_task, nullptr, error)) FatalError(error); if (++update_task_id > update_task_id_max) @@ -110,7 +108,7 @@ spawn_update_task(const char *path) } unsigned -update_enqueue(const char *path, bool _discard) +update_enqueue(const char *path, bool discard) { assert(main_thread.IsInside()); @@ -126,8 +124,7 @@ update_enqueue(const char *path, bool _discard) return next_task_id > update_task_id_max ? 1 : next_task_id; } - discard = _discard; - spawn_update_task(path); + spawn_update_task(UpdateQueueItem(path, discard)); idle_add(IDLE_UPDATE); @@ -152,8 +149,7 @@ static void update_finished_event(void) auto i = update_queue_shift(); if (i.IsDefined()) { /* schedule the next path */ - discard = i.discard; - spawn_update_task(i.path_utf8.c_str()); + spawn_update_task(std::move(i)); } else { progress = UPDATE_PROGRESS_IDLE; |