storage/Composite: use std::unique_ptr<Storage>
This commit is contained in:
parent
3c5e4e2788
commit
dcd483bd99
@ -181,7 +181,7 @@ InitStorage(EventLoop &event_loop)
|
||||
|
||||
CompositeStorage *composite = new CompositeStorage();
|
||||
instance->storage = composite;
|
||||
composite->Mount("", storage.release());
|
||||
composite->Mount("", std::move(storage));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -205,7 +205,7 @@ handle_mount(Client &client, Request args, Response &r)
|
||||
return CommandResult::ERROR;
|
||||
}
|
||||
|
||||
composite.Mount(local_uri, storage.release());
|
||||
composite.Mount(local_uri, std::move(storage));
|
||||
instance.EmitIdle(IDLE_MOUNT);
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
|
@ -103,11 +103,6 @@ NextSegment(const char *&uri_r)
|
||||
}
|
||||
}
|
||||
|
||||
CompositeStorage::Directory::~Directory()
|
||||
{
|
||||
delete storage;
|
||||
}
|
||||
|
||||
const CompositeStorage::Directory *
|
||||
CompositeStorage::Directory::Find(const char *uri) const noexcept
|
||||
{
|
||||
@ -144,8 +139,7 @@ CompositeStorage::Directory::Unmount() noexcept
|
||||
if (storage == nullptr)
|
||||
return false;
|
||||
|
||||
delete storage;
|
||||
storage = nullptr;
|
||||
storage.reset();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -210,18 +204,16 @@ CompositeStorage::GetMount(const char *uri) noexcept
|
||||
/* not a mount point */
|
||||
return nullptr;
|
||||
|
||||
return result.directory->storage;
|
||||
return result.directory->storage.get();
|
||||
}
|
||||
|
||||
void
|
||||
CompositeStorage::Mount(const char *uri, Storage *storage)
|
||||
CompositeStorage::Mount(const char *uri, std::unique_ptr<Storage> storage)
|
||||
{
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
|
||||
Directory &directory = root.Make(uri);
|
||||
if (directory.storage != nullptr)
|
||||
delete directory.storage;
|
||||
directory.storage = storage;
|
||||
directory.storage = std::move(storage);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "thread/Mutex.hxx"
|
||||
#include "Compiler.h"
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
@ -47,13 +48,10 @@ class CompositeStorage final : public Storage {
|
||||
* Other Directory instances may have one, and child
|
||||
* mounts will be "mixed" in.
|
||||
*/
|
||||
Storage *storage;
|
||||
std::unique_ptr<Storage> storage;
|
||||
|
||||
std::map<std::string, Directory> children;
|
||||
|
||||
Directory():storage(nullptr) {}
|
||||
~Directory();
|
||||
|
||||
gcc_pure
|
||||
bool IsEmpty() const noexcept {
|
||||
return storage == nullptr && children.empty();
|
||||
@ -115,7 +113,7 @@ public:
|
||||
VisitMounts(uri, root, t);
|
||||
}
|
||||
|
||||
void Mount(const char *uri, Storage *storage);
|
||||
void Mount(const char *uri, std::unique_ptr<Storage> storage);
|
||||
bool Unmount(const char *uri);
|
||||
|
||||
/* virtual methods from class Storage */
|
||||
@ -133,9 +131,8 @@ private:
|
||||
template<typename T>
|
||||
void VisitMounts(std::string &uri, const Directory &directory,
|
||||
T t) const {
|
||||
const Storage *const storage = directory.storage;
|
||||
if (storage != nullptr)
|
||||
t(uri.c_str(), *storage);
|
||||
if (directory.storage)
|
||||
t(uri.c_str(), *directory.storage);
|
||||
|
||||
if (!uri.empty())
|
||||
uri.push_back('/');
|
||||
|
@ -120,7 +120,7 @@ storage_state_restore(const char *line, TextFile &file, Instance &instance)
|
||||
}
|
||||
|
||||
((CompositeStorage*)instance.storage)->Mount(uri.c_str(),
|
||||
storage.release());
|
||||
std::move(storage));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user