aboutsummaryrefslogtreecommitdiffstats
path: root/src/InotifyQueue.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/InotifyQueue.cxx (renamed from src/inotify_queue.c)74
1 files changed, 17 insertions, 57 deletions
diff --git a/src/inotify_queue.c b/src/InotifyQueue.cxx
index d5e2228c3..3212f95f9 100644
--- a/src/inotify_queue.c
+++ b/src/InotifyQueue.cxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2011 The Music Player Daemon Project
+ * Copyright (C) 2003-2013 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -18,8 +18,9 @@
*/
#include "config.h"
-#include "inotify_queue.h"
-#include "update.h"
+#include "InotifyQueue.hxx"
+#include "UpdateGlue.hxx"
+#include "event/Loop.hxx"
#include <glib.h>
@@ -37,37 +38,13 @@ enum {
INOTIFY_UPDATE_DELAY_S = 5,
};
-static GSList *inotify_queue;
-static guint queue_source_id;
-
-void
-mpd_inotify_queue_init(void)
-{
-}
-
-static void
-free_callback(gpointer data, G_GNUC_UNUSED gpointer user_data)
-{
- g_free(data);
-}
-
-void
-mpd_inotify_queue_finish(void)
-{
- if (queue_source_id != 0)
- g_source_remove(queue_source_id);
-
- g_slist_foreach(inotify_queue, free_callback, NULL);
- g_slist_free(inotify_queue);
-}
-
-static gboolean
-mpd_inotify_run_update(G_GNUC_UNUSED gpointer data)
+bool
+InotifyQueue::OnTimeout()
{
unsigned id;
- while (inotify_queue != NULL) {
- char *uri_utf8 = inotify_queue->data;
+ while (!queue.empty()) {
+ const char *uri_utf8 = queue.front().c_str();
id = update_enqueue(uri_utf8, false);
if (id == 0)
@@ -76,13 +53,10 @@ mpd_inotify_run_update(G_GNUC_UNUSED gpointer data)
g_debug("updating '%s' job=%u", uri_utf8, id);
- g_free(uri_utf8);
- inotify_queue = g_slist_delete_link(inotify_queue,
- inotify_queue);
+ queue.pop_front();
}
/* done, remove the timer event by returning false */
- queue_source_id = 0;
return false;
}
@@ -97,39 +71,25 @@ path_in(const char *path, const char *possible_parent)
}
void
-mpd_inotify_enqueue(char *uri_utf8)
+InotifyQueue::Enqueue(const char *uri_utf8)
{
- GSList *old_queue = inotify_queue;
-
- if (queue_source_id != 0)
- g_source_remove(queue_source_id);
- queue_source_id = g_timeout_add_seconds(INOTIFY_UPDATE_DELAY_S,
- mpd_inotify_run_update, NULL);
+ ScheduleSeconds(INOTIFY_UPDATE_DELAY_S);
- inotify_queue = NULL;
- while (old_queue != NULL) {
- char *current_uri = old_queue->data;
+ for (auto i = queue.begin(), end = queue.end(); i != end;) {
+ const char *current_uri = i->c_str();
- if (path_in(uri_utf8, current_uri)) {
+ if (path_in(uri_utf8, current_uri))
/* already enqueued */
- g_free(uri_utf8);
- inotify_queue = g_slist_concat(inotify_queue,
- old_queue);
return;
- }
-
- old_queue = g_slist_delete_link(old_queue, old_queue);
if (path_in(current_uri, uri_utf8))
/* existing path is a sub-path of the new
path; we can dequeue the existing path and
update the new path instead */
- g_free(current_uri);
+ i = queue.erase(i);
else
- /* move the existing path to the new queue */
- inotify_queue = g_slist_prepend(inotify_queue,
- current_uri);
+ ++i;
}
- inotify_queue = g_slist_prepend(inotify_queue, uri_utf8);
+ queue.emplace_back(uri_utf8);
}