diff options
-rw-r--r-- | src/db/update/Container.cxx | 4 | ||||
-rw-r--r-- | src/db/update/Editor.cxx | 16 | ||||
-rw-r--r-- | src/db/update/Editor.hxx | 10 | ||||
-rw-r--r-- | src/db/update/UpdateSong.cxx | 18 | ||||
-rw-r--r-- | src/db/update/Walk.cxx | 15 |
5 files changed, 36 insertions, 27 deletions
diff --git a/src/db/update/Container.cxx b/src/db/update/Container.cxx index 38aacea0a..33e29953d 100644 --- a/src/db/update/Container.cxx +++ b/src/db/update/Container.cxx @@ -118,9 +118,7 @@ UpdateWalk::UpdateContainerFile(Directory &directory, } if (tnum == 1) { - db_lock(); - editor.DeleteDirectory(contdir); - db_unlock(); + editor.LockDeleteDirectory(contdir); return false; } else return true; diff --git a/src/db/update/Editor.cxx b/src/db/update/Editor.cxx index 369bad24b..c8f58931f 100644 --- a/src/db/update/Editor.cxx +++ b/src/db/update/Editor.cxx @@ -47,6 +47,14 @@ DatabaseEditor::DeleteSong(Directory &dir, Song *del) db_lock(); } +void +DatabaseEditor::LockDeleteSong(Directory &parent, Song *song) +{ + db_lock(); + DeleteSong(parent, song); + db_unlock(); +} + /** * Recursively remove all sub directories and songs from a directory, * leaving an empty directory. @@ -77,6 +85,14 @@ DatabaseEditor::DeleteDirectory(Directory *directory) directory->Delete(); } +void +DatabaseEditor::LockDeleteDirectory(Directory *directory) +{ + db_lock(); + DeleteDirectory(directory); + db_unlock(); +} + bool DatabaseEditor::DeleteNameIn(Directory &parent, const char *name) { diff --git a/src/db/update/Editor.hxx b/src/db/update/Editor.hxx index a9093d662..b1c99095f 100644 --- a/src/db/update/Editor.hxx +++ b/src/db/update/Editor.hxx @@ -40,6 +40,11 @@ public: void DeleteSong(Directory &parent, Song *song); /** + * DeleteSong() with automatic locking. + */ + void LockDeleteSong(Directory &parent, Song *song); + + /** * Recursively free a directory and all its contents. * * Caller must lock the #db_mutex. @@ -47,6 +52,11 @@ public: void DeleteDirectory(Directory *directory); /** + * DeleteDirectory() with automatic locking. + */ + void LockDeleteDirectory(Directory *directory); + + /** * Caller must NOT lock the #db_mutex. * * @return true if the database was modified diff --git a/src/db/update/UpdateSong.cxx b/src/db/update/UpdateSong.cxx index afd609f9a..751d8bfe9 100644 --- a/src/db/update/UpdateSong.cxx +++ b/src/db/update/UpdateSong.cxx @@ -42,11 +42,8 @@ UpdateWalk::UpdateSongFile2(Directory &directory, FormatError(update_domain, "no read permissions on %s/%s", directory.GetPath(), name); - if (song != nullptr) { - db_lock(); - editor.DeleteSong(directory, song); - db_unlock(); - } + if (song != nullptr) + editor.LockDeleteSong(directory, song); return; } @@ -54,11 +51,8 @@ UpdateWalk::UpdateSongFile2(Directory &directory, if (!(song != nullptr && st->st_mtime == song->mtime && !walk_discard) && UpdateContainerFile(directory, name, suffix, st)) { - if (song != nullptr) { - db_lock(); - editor.DeleteSong(directory, song); - db_unlock(); - } + if (song != nullptr) + editor.LockDeleteSong(directory, song); return; } @@ -88,9 +82,7 @@ UpdateWalk::UpdateSongFile2(Directory &directory, FormatDebug(update_domain, "deleting unrecognized file %s/%s", directory.GetPath(), name); - db_lock(); - editor.DeleteSong(directory, song); - db_unlock(); + editor.LockDeleteSong(directory, song); } modified = true; diff --git a/src/db/update/Walk.cxx b/src/db/update/Walk.cxx index 1ca589456..ff59fe960 100644 --- a/src/db/update/Walk.cxx +++ b/src/db/update/Walk.cxx @@ -107,9 +107,7 @@ UpdateWalk::PurgeDeletedFromDirectory(Directory &directory) if (directory_exists(*child)) continue; - db_lock(); - editor.DeleteDirectory(child); - db_unlock(); + editor.LockDeleteDirectory(child); modified = true; } @@ -118,9 +116,7 @@ UpdateWalk::PurgeDeletedFromDirectory(Directory &directory) directory_for_each_song_safe(song, ns, directory) { const auto path = map_song_fs(*song); if (path.IsNull() || !FileExists(path)) { - db_lock(); - editor.DeleteSong(directory, song); - db_unlock(); + editor.LockDeleteSong(directory, song); modified = true; } @@ -223,11 +219,8 @@ UpdateWalk::UpdateDirectoryChild(Directory &directory, assert(&directory == subdir->parent); - if (!UpdateDirectory(*subdir, st)) { - db_lock(); - editor.DeleteDirectory(subdir); - db_unlock(); - } + if (!UpdateDirectory(*subdir, st)) + editor.LockDeleteDirectory(subdir); } else { FormatDebug(update_domain, "%s is not a directory, archive or music", name); |