| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
- // This source code is licensed under both the GPLv2 (found in the
- // COPYING file in the root directory) and Apache 2.0 License
- // (found in the LICENSE.Apache file in the root directory).
- //
- // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file. See the AUTHORS file for names of contributors.
- //
- // Abstract interface for allocating memory in blocks. This memory is freed
- // when the allocator object is destroyed. See the Arena class for more info.
- #pragma once
- #include <cerrno>
- #include <cstddef>
- #include "rocksdb/write_buffer_manager.h"
- namespace ROCKSDB_NAMESPACE {
- class Logger;
- class Allocator {
- public:
- virtual ~Allocator() {}
- virtual char* Allocate(size_t bytes) = 0;
- virtual char* AllocateAligned(size_t bytes, size_t huge_page_size = 0,
- Logger* logger = nullptr) = 0;
- virtual size_t BlockSize() const = 0;
- };
- class AllocTracker {
- public:
- explicit AllocTracker(WriteBufferManager* write_buffer_manager);
- // No copying allowed
- AllocTracker(const AllocTracker&) = delete;
- void operator=(const AllocTracker&) = delete;
- ~AllocTracker();
- void Allocate(size_t bytes);
- // Call when we're finished allocating memory so we can free it from
- // the write buffer's limit.
- void DoneAllocating();
- void FreeMem();
- bool is_freed() const { return write_buffer_manager_ == nullptr || freed_; }
- private:
- WriteBufferManager* write_buffer_manager_;
- std::atomic<size_t> bytes_allocated_;
- bool done_allocating_;
- bool freed_;
- };
- } // namespace ROCKSDB_NAMESPACE
|