blob: 6074ab2a1fc111722232eebefb0096e18038ed08 [file] [log] [blame]
// Copyright 2019 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.
#pragma once
#ifndef __Fuchsia__
#error Fuchsia-only Header
#endif
#include <utility>
#include <blobfs/operation.h>
#include <fbl/macros.h>
#include <fbl/vector.h>
#include <lib/zx/vmo.h>
#include <zircon/assert.h>
#include <zircon/device/block.h>
namespace blobfs {
// A builder which helps clients collect and coalesce UnbufferedOperations which target the same
// in-memory / on-disk structures.
//
// This class is thread-compatible.
class UnbufferedOperationsBuilder {
public:
UnbufferedOperationsBuilder() : block_count_(0) {}
UnbufferedOperationsBuilder(const UnbufferedOperationsBuilder&) = delete;
UnbufferedOperationsBuilder& operator=(const UnbufferedOperationsBuilder&) = delete;
UnbufferedOperationsBuilder(UnbufferedOperationsBuilder&&) = default;
UnbufferedOperationsBuilder& operator=(UnbufferedOperationsBuilder&&) = default;
~UnbufferedOperationsBuilder();
// Returns the total number of blocks in all requests.
uint64_t BlockCount() const { return block_count_; }
// Adds a UnbufferedOperation to the list of requests.
//
// Empty requests are dropped.
void Add(const UnbufferedOperation& operation);
// Removes the vector of requests, and returns them to the caller.
// This resets the |UnbufferedOperationsBuilder| object.
fbl::Vector<UnbufferedOperation> TakeOperations();
private:
fbl::Vector<UnbufferedOperation> operations_;
uint64_t block_count_;
};
// Sums the |length| of all requests.
uint64_t BlockCount(const fbl::Vector<UnbufferedOperation>& requests);
} // namespace blobfs