From 814208063300d9791d1695e1dbbd784ec5818280 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 30 Jan 2013 15:39:29 +0100 Subject: InotifyUpdate: use std::list instead of GList Let STL manage the WatchDirectory allocations. --- src/InotifyUpdate.cxx | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/InotifyUpdate.cxx b/src/InotifyUpdate.cxx index d56e0517..2de3bf62 100644 --- a/src/InotifyUpdate.cxx +++ b/src/InotifyUpdate.cxx @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -54,17 +55,18 @@ struct WatchDirectory { int descriptor; - GList *children; + std::forward_list 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); } }; @@ -100,6 +102,17 @@ tree_find_watch_directory(int wd) return i->second; } +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) { @@ -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(); } -- cgit v1.2.3