UpdateQueue: use std::string and std::queue
This commit is contained in:
		@@ -139,8 +139,6 @@ update_enqueue(const char *path, bool _discard)
 | 
			
		||||
 */
 | 
			
		||||
static void update_finished_event(void)
 | 
			
		||||
{
 | 
			
		||||
	char *path;
 | 
			
		||||
 | 
			
		||||
	assert(progress == UPDATE_PROGRESS_DONE);
 | 
			
		||||
 | 
			
		||||
	update_thread.Join();
 | 
			
		||||
@@ -151,11 +149,11 @@ static void update_finished_event(void)
 | 
			
		||||
		/* send "idle" events */
 | 
			
		||||
		instance->DatabaseModified();
 | 
			
		||||
 | 
			
		||||
	path = update_queue_shift(&discard);
 | 
			
		||||
	if (path != NULL) {
 | 
			
		||||
	auto i = update_queue_shift();
 | 
			
		||||
	if (i.IsDefined()) {
 | 
			
		||||
		/* schedule the next path */
 | 
			
		||||
		spawn_update_task(path);
 | 
			
		||||
		g_free(path);
 | 
			
		||||
		discard = i.discard;
 | 
			
		||||
		spawn_update_task(i.path_utf8.c_str());
 | 
			
		||||
	} else {
 | 
			
		||||
		progress = UPDATE_PROGRESS_IDLE;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,49 +19,31 @@
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "UpdateQueue.hxx"
 | 
			
		||||
#include "util/Macros.hxx"
 | 
			
		||||
 | 
			
		||||
#include <glib.h>
 | 
			
		||||
#include <queue>
 | 
			
		||||
#include <list>
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
static constexpr unsigned MAX_UPDATE_QUEUE_SIZE = 32;
 | 
			
		||||
 | 
			
		||||
/* make this dynamic?, or maybe this is big enough... */
 | 
			
		||||
static struct {
 | 
			
		||||
	char *path;
 | 
			
		||||
	bool discard;
 | 
			
		||||
} update_queue[32];
 | 
			
		||||
 | 
			
		||||
static size_t update_queue_length;
 | 
			
		||||
static std::queue<UpdateQueueItem, std::list<UpdateQueueItem>> update_queue;
 | 
			
		||||
 | 
			
		||||
unsigned
 | 
			
		||||
update_queue_push(const char *path, bool discard, unsigned base)
 | 
			
		||||
{
 | 
			
		||||
	assert(update_queue_length <= ARRAY_SIZE(update_queue));
 | 
			
		||||
 | 
			
		||||
	if (update_queue_length == ARRAY_SIZE(update_queue))
 | 
			
		||||
	if (update_queue.size() >= MAX_UPDATE_QUEUE_SIZE)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	update_queue[update_queue_length].path = g_strdup(path);
 | 
			
		||||
	update_queue[update_queue_length].discard = discard;
 | 
			
		||||
 | 
			
		||||
	++update_queue_length;
 | 
			
		||||
 | 
			
		||||
	return base + update_queue_length;
 | 
			
		||||
	update_queue.emplace(path, discard);
 | 
			
		||||
	return base + update_queue.size();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
update_queue_shift(bool *discard_r)
 | 
			
		||||
UpdateQueueItem
 | 
			
		||||
update_queue_shift()
 | 
			
		||||
{
 | 
			
		||||
	char *path;
 | 
			
		||||
	if (update_queue.empty())
 | 
			
		||||
		return UpdateQueueItem();
 | 
			
		||||
 | 
			
		||||
	if (update_queue_length == 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	path = update_queue[0].path;
 | 
			
		||||
	*discard_r = update_queue[0].discard;
 | 
			
		||||
 | 
			
		||||
	memmove(&update_queue[0], &update_queue[1],
 | 
			
		||||
		--update_queue_length * sizeof(update_queue[0]));
 | 
			
		||||
	return path;
 | 
			
		||||
	auto i = std::move(update_queue.front());
 | 
			
		||||
	update_queue.pop();
 | 
			
		||||
	return i;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -22,10 +22,25 @@
 | 
			
		||||
 | 
			
		||||
#include "check.h"
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
struct UpdateQueueItem {
 | 
			
		||||
	std::string path_utf8;
 | 
			
		||||
	bool discard;
 | 
			
		||||
 | 
			
		||||
	UpdateQueueItem() = default;
 | 
			
		||||
	UpdateQueueItem(const char *_path, bool _discard)
 | 
			
		||||
		:path_utf8(_path), discard(_discard) {}
 | 
			
		||||
 | 
			
		||||
	bool IsDefined() const {
 | 
			
		||||
		return !path_utf8.empty();
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned
 | 
			
		||||
update_queue_push(const char *path, bool discard, unsigned base);
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
update_queue_shift(bool *discard_r);
 | 
			
		||||
UpdateQueueItem
 | 
			
		||||
update_queue_shift();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user