UpdateGlue: handle update id management
Add UpdateQueueItem::id to keep track of the id in every item. Replaces thhe hack in update_queue_push().
This commit is contained in:
@@ -57,7 +57,7 @@ static UpdateQueueItem next;
|
|||||||
unsigned
|
unsigned
|
||||||
isUpdatingDB(void)
|
isUpdatingDB(void)
|
||||||
{
|
{
|
||||||
return (progress != UPDATE_PROGRESS_IDLE) ? update_task_id : 0;
|
return next.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -101,10 +101,17 @@ spawn_update_task(UpdateQueueItem &&i)
|
|||||||
if (!update_thread.Start(update_task, nullptr, error))
|
if (!update_thread.Start(update_task, nullptr, error))
|
||||||
FatalError(error);
|
FatalError(error);
|
||||||
|
|
||||||
if (++update_task_id > update_task_id_max)
|
|
||||||
update_task_id = 1;
|
|
||||||
FormatDebug(update_domain,
|
FormatDebug(update_domain,
|
||||||
"spawned thread for update job id %i", update_task_id);
|
"spawned thread for update job id %i", next.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned
|
||||||
|
generate_update_id()
|
||||||
|
{
|
||||||
|
unsigned id = update_task_id + 1;
|
||||||
|
if (id > update_task_id_max)
|
||||||
|
id = 1;
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
@@ -116,19 +123,20 @@ update_enqueue(const char *path, bool discard)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (progress != UPDATE_PROGRESS_IDLE) {
|
if (progress != UPDATE_PROGRESS_IDLE) {
|
||||||
unsigned next_task_id =
|
const unsigned id = generate_update_id();
|
||||||
update_queue_push(path, discard, update_task_id);
|
if (!update_queue_push(path, discard, id))
|
||||||
if (next_task_id == 0)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return next_task_id > update_task_id_max ? 1 : next_task_id;
|
update_task_id = id;
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
spawn_update_task(UpdateQueueItem(path, discard));
|
const unsigned id = update_task_id = generate_update_id();
|
||||||
|
spawn_update_task(UpdateQueueItem(path, discard, id));
|
||||||
|
|
||||||
idle_add(IDLE_UPDATE);
|
idle_add(IDLE_UPDATE);
|
||||||
|
|
||||||
return update_task_id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -137,8 +145,10 @@ update_enqueue(const char *path, bool discard)
|
|||||||
static void update_finished_event(void)
|
static void update_finished_event(void)
|
||||||
{
|
{
|
||||||
assert(progress == UPDATE_PROGRESS_DONE);
|
assert(progress == UPDATE_PROGRESS_DONE);
|
||||||
|
assert(next.IsDefined());
|
||||||
|
|
||||||
update_thread.Join();
|
update_thread.Join();
|
||||||
|
next = UpdateQueueItem();
|
||||||
|
|
||||||
idle_add(IDLE_UPDATE);
|
idle_add(IDLE_UPDATE);
|
||||||
|
|
||||||
|
@@ -27,14 +27,14 @@ static constexpr unsigned MAX_UPDATE_QUEUE_SIZE = 32;
|
|||||||
|
|
||||||
static std::queue<UpdateQueueItem, std::list<UpdateQueueItem>> update_queue;
|
static std::queue<UpdateQueueItem, std::list<UpdateQueueItem>> update_queue;
|
||||||
|
|
||||||
unsigned
|
bool
|
||||||
update_queue_push(const char *path, bool discard, unsigned base)
|
update_queue_push(const char *path, bool discard, unsigned id)
|
||||||
{
|
{
|
||||||
if (update_queue.size() >= MAX_UPDATE_QUEUE_SIZE)
|
if (update_queue.size() >= MAX_UPDATE_QUEUE_SIZE)
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
update_queue.emplace(path, discard);
|
update_queue.emplace(path, discard, id);
|
||||||
return base + update_queue.size();
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateQueueItem
|
UpdateQueueItem
|
||||||
|
@@ -26,19 +26,21 @@
|
|||||||
|
|
||||||
struct UpdateQueueItem {
|
struct UpdateQueueItem {
|
||||||
std::string path_utf8;
|
std::string path_utf8;
|
||||||
|
unsigned id;
|
||||||
bool discard;
|
bool discard;
|
||||||
|
|
||||||
UpdateQueueItem() = default;
|
UpdateQueueItem():id(0) {}
|
||||||
UpdateQueueItem(const char *_path, bool _discard)
|
UpdateQueueItem(const char *_path, bool _discard,
|
||||||
:path_utf8(_path), discard(_discard) {}
|
unsigned _id)
|
||||||
|
:path_utf8(_path), id(_id), discard(_discard) {}
|
||||||
|
|
||||||
bool IsDefined() const {
|
bool IsDefined() const {
|
||||||
return !path_utf8.empty();
|
return id != 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned
|
bool
|
||||||
update_queue_push(const char *path, bool discard, unsigned base);
|
update_queue_push(const char *path, bool discard, unsigned id);
|
||||||
|
|
||||||
UpdateQueueItem
|
UpdateQueueItem
|
||||||
update_queue_shift();
|
update_queue_shift();
|
||||||
|
Reference in New Issue
Block a user