blob: fb42691ee18bd54e93c873d19f498a13a5751028 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_STORAGE_BLOBFS_INCLUDE_BLOBFS_NODE_FINDER_H_
#define SRC_STORAGE_BLOBFS_INCLUDE_BLOBFS_NODE_FINDER_H_
#include <lib/zx/status.h>
#include "src/storage/blobfs/format.h"
namespace blobfs {
class NodeFinder;
// NodeFinder subclasses return pointers to Inodes. When they go out of scope, DropInodePtr is
// called. This can be used to maintain any locks that might need to be in place.
struct InodePtrDeleter {
InodePtrDeleter() = default;
explicit InodePtrDeleter(NodeFinder* finder) : finder_(finder) {}
void operator()(Inode* inode);
NodeFinder* finder_ = nullptr;
};
// Don't assume that memory is freed when the pointer goes out of scope. Subclasses are free to
// implement a cache of nodes and hand out pointers to the cache instead.
using InodePtr = std::unique_ptr<Inode, InodePtrDeleter>;
// Interface to look up nodes.
class NodeFinder {
public:
virtual ~NodeFinder() = default;
// Returns a pointer to the requested node or an error if |node_index| is out of range.
virtual zx::status<InodePtr> GetNode(uint32_t node_index) = 0;
// Called when an InodePtr goes out of scope.
virtual void DropInodePtr() {}
};
inline void InodePtrDeleter::operator()(Inode* inode) {
if (finder_) {
finder_->DropInodePtr();
}
}
} // namespace blobfs
#endif // SRC_STORAGE_BLOBFS_INCLUDE_BLOBFS_NODE_FINDER_H_