aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/InotifyUpdate.cxx50
1 files changed, 25 insertions, 25 deletions
diff --git a/src/InotifyUpdate.cxx b/src/InotifyUpdate.cxx
index d56e0517b..2de3bf627 100644
--- a/src/InotifyUpdate.cxx
+++ b/src/InotifyUpdate.cxx
@@ -28,6 +28,7 @@
#include <glib.h>
#include <map>
+#include <forward_list>
#include <assert.h>
#include <sys/inotify.h>
@@ -54,17 +55,18 @@ struct WatchDirectory {
int descriptor;
- GList *children;
+ std::forward_list<WatchDirectory> children;
WatchDirectory(WatchDirectory *_parent, const char *_name,
int _descriptor)
:parent(_parent), name(g_strdup(_name)),
- descriptor(_descriptor),
- children(nullptr) {}
+ descriptor(_descriptor) {}
+
+ WatchDirectory(const WatchDirectory &) = delete;
+ WatchDirectory &operator=(const WatchDirectory &) = delete;
~WatchDirectory() {
g_free(name);
- g_list_free(children);
}
};
@@ -101,6 +103,17 @@ tree_find_watch_directory(int wd)
}
static void
+disable_watch_directory(WatchDirectory &directory)
+{
+ tree_remove_watch_directory(&directory);
+
+ for (WatchDirectory &child : directory.children)
+ disable_watch_directory(child);
+
+ inotify_source->Remove(directory.descriptor);
+}
+
+static void
remove_watch_directory(WatchDirectory *directory)
{
assert(directory != NULL);
@@ -111,18 +124,12 @@ remove_watch_directory(WatchDirectory *directory)
return;
}
- assert(directory->parent->children != NULL);
+ disable_watch_directory(*directory);
- tree_remove_watch_directory(directory);
-
- while (directory->children != NULL)
- remove_watch_directory((WatchDirectory *)directory->children->data);
-
- directory->parent->children =
- g_list_remove(directory->parent->children, directory);
-
- inotify_source->Remove(directory->descriptor);
- delete directory;
+ /* remove it from the parent, which effectively deletes it */
+ directory->parent->children.remove_if([directory](const WatchDirectory &child){
+ return &child == directory;
+ });
}
static char *
@@ -214,10 +221,8 @@ recursive_watch_subdirectories(WatchDirectory *directory,
continue;
}
- child = new WatchDirectory(directory, ent->d_name, ret);
-
- directory->children = g_list_prepend(directory->children,
- child);
+ directory->children.emplace_front(directory, ent->d_name, ret);
+ child = &directory->children.front();
tree_add_watch_directory(child);
@@ -353,11 +358,6 @@ mpd_inotify_finish(void)
delete inotify_queue;
delete inotify_source;
-
- for (auto i : inotify_directories) {
- WatchDirectory *directory = i.second;
- delete directory;
- }
-
+ delete inotify_root;
inotify_directories.clear();
}