/src/rocksdb/memtable/alloc_tracker.cc
Line | Count | Source |
1 | | // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. |
2 | | // This source code is licensed under both the GPLv2 (found in the |
3 | | // COPYING file in the root directory) and Apache 2.0 License |
4 | | // (found in the LICENSE.Apache file in the root directory). |
5 | | // |
6 | | // Copyright (c) 2011 The LevelDB Authors. All rights reserved. |
7 | | // Use of this source code is governed by a BSD-style license that can be |
8 | | // found in the LICENSE file. See the AUTHORS file for names of contributors. |
9 | | |
10 | | #include <cassert> |
11 | | |
12 | | #include "memory/allocator.h" |
13 | | #include "memory/arena.h" |
14 | | #include "rocksdb/write_buffer_manager.h" |
15 | | |
16 | | namespace ROCKSDB_NAMESPACE { |
17 | | |
18 | | AllocTracker::AllocTracker(WriteBufferManager* write_buffer_manager) |
19 | 95.9k | : write_buffer_manager_(write_buffer_manager), |
20 | 95.9k | bytes_allocated_(0), |
21 | 95.9k | done_allocating_(false), |
22 | 95.9k | freed_(false) {} |
23 | | |
24 | 95.9k | AllocTracker::~AllocTracker() { FreeMem(); } |
25 | | |
26 | 0 | void AllocTracker::Allocate(size_t bytes) { |
27 | 0 | assert(write_buffer_manager_ != nullptr); |
28 | 0 | if (write_buffer_manager_->enabled() || |
29 | 0 | write_buffer_manager_->cost_to_cache()) { |
30 | 0 | bytes_allocated_.fetch_add(bytes, std::memory_order_relaxed); |
31 | 0 | write_buffer_manager_->ReserveMem(bytes); |
32 | 0 | } |
33 | 0 | } |
34 | | |
35 | 95.9k | void AllocTracker::DoneAllocating() { |
36 | 95.9k | if (write_buffer_manager_ != nullptr && !done_allocating_) { |
37 | 95.9k | if (write_buffer_manager_->enabled() || |
38 | 95.9k | write_buffer_manager_->cost_to_cache()) { |
39 | 0 | write_buffer_manager_->ScheduleFreeMem( |
40 | 0 | bytes_allocated_.load(std::memory_order_relaxed)); |
41 | 95.9k | } else { |
42 | 95.9k | assert(bytes_allocated_.load(std::memory_order_relaxed) == 0); |
43 | 95.9k | } |
44 | 95.9k | done_allocating_ = true; |
45 | 95.9k | } |
46 | 95.9k | } |
47 | | |
48 | 191k | void AllocTracker::FreeMem() { |
49 | 191k | if (!done_allocating_) { |
50 | 94.2k | DoneAllocating(); |
51 | 94.2k | } |
52 | 191k | if (write_buffer_manager_ != nullptr && !freed_) { |
53 | 95.9k | if (write_buffer_manager_->enabled() || |
54 | 95.9k | write_buffer_manager_->cost_to_cache()) { |
55 | 0 | write_buffer_manager_->FreeMem( |
56 | 0 | bytes_allocated_.load(std::memory_order_relaxed)); |
57 | 95.9k | } else { |
58 | | assert(bytes_allocated_.load(std::memory_order_relaxed) == 0); |
59 | 95.9k | } |
60 | 95.9k | freed_ = true; |
61 | 95.9k | } |
62 | 191k | } |
63 | | } // namespace ROCKSDB_NAMESPACE |