blob: 1c4ed3f2c08d157255083df2b5ef55738723e7bd [file]
// Copyright 2020 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_LIB_BUFFER_RESIZEABLE_VMO_BUFFER_H_
#define SRC_STORAGE_LIB_BUFFER_RESIZEABLE_VMO_BUFFER_H_
#include <lib/zx/result.h>
#include <lib/zx/vmo.h>
#include <zircon/types.h>
#include <cstddef>
#include <cstdint>
#include <string_view>
#include "src/storage/lib/buffer/block_buffer.h"
#include "src/storage/lib/buffer/mapped_vmo.h"
#include "src/storage/lib/buffer/vmoid_registry.h"
namespace storage {
// A resizeable VMO buffer. The buffer isn't usable until Attach is called.
class ResizeableVmoBuffer : public BlockBuffer {
public:
explicit ResizeableVmoBuffer(uint32_t block_size) : block_size_(block_size) {}
ResizeableVmoBuffer(ResizeableVmoBuffer&&) = default;
ResizeableVmoBuffer& operator=(ResizeableVmoBuffer&&) = delete;
// BlockBuffer interface:
size_t capacity() const override { return mapped_vmo_.size() / block_size_; }
uint32_t BlockSize() const override { return block_size_; }
vmoid_t vmoid() const override { return vmoid_.get(); }
zx_handle_t Vmo() const override { return mapped_vmo_.vmo().get(); }
void* Data(size_t index) override {
return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(mapped_vmo_.start()) +
index * block_size_);
}
const void* Data(size_t index) const override {
return reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(mapped_vmo_.start()) +
index * block_size_);
}
const zx::vmo& vmo() { return mapped_vmo_.vmo(); }
zx::result<> Grow(size_t block_count) { return mapped_vmo_.Grow(block_count * block_size_); }
zx::result<> Shrink(size_t block_count) { return mapped_vmo_.Shrink(block_count * block_size_); }
zx::result<> Attach(std::string_view name, VmoidRegistry& device);
zx::result<> Detach(VmoidRegistry& device);
zx_status_t Zero(size_t index, size_t count) override;
private:
ResizeableVmoBuffer();
uint32_t block_size_;
MappedVmo mapped_vmo_;
Vmoid vmoid_;
};
} // namespace storage
#endif // SRC_STORAGE_LIB_BUFFER_RESIZEABLE_VMO_BUFFER_H_