db/update/Editor: add locking method variants
This commit is contained in:
parent
04b4f53488
commit
26970579b8
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -39,6 +39,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.
|
||||
*
|
||||
@ -46,6 +51,11 @@ public:
|
||||
*/
|
||||
void DeleteDirectory(Directory *directory);
|
||||
|
||||
/**
|
||||
* DeleteDirectory() with automatic locking.
|
||||
*/
|
||||
void LockDeleteDirectory(Directory *directory);
|
||||
|
||||
/**
|
||||
* Caller must NOT lock the #db_mutex.
|
||||
*
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user