6301dbe7a7
Summary: As the first step of reintroducing eviction statistics for the block cache, the patch switches from using simple function pointers as deleters to function objects implementing an interface. This will enable using deleters that have state, like a smart pointer to the statistics object that is to be updated when an entry is removed from the cache. For now, the patch adds a deleter template class `SimpleDeleter`, which simply casts the `value` pointer to its original type and calls `delete` or `delete[]` on it as appropriate. Note: to prevent object lifecycle issues, deleters must outlive the cache entries referring to them; `SimpleDeleter` ensures this by using the ("leaky") Meyers singleton pattern. Pull Request resolved: https://github.com/facebook/rocksdb/pull/6545 Test Plan: `make asan_check` Reviewed By: siying Differential Revision: D20475823 Pulled By: ltamasi fbshipit-source-id: fe354c33dd96d9bafc094605462352305449a22a
48 lines
1.1 KiB
C++
48 lines
1.1 KiB
C++
// 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).
|
|
|
|
#pragma once
|
|
|
|
#include "rocksdb/cache.h"
|
|
#include "rocksdb/rocksdb_namespace.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
template <typename T>
|
|
class SimpleDeleter : public Cache::Deleter {
|
|
public:
|
|
static SimpleDeleter* GetInstance() {
|
|
static auto deleter = new SimpleDeleter;
|
|
return deleter;
|
|
}
|
|
|
|
void operator()(const Slice& /* key */, void* value) override {
|
|
T* const t = static_cast<T*>(value);
|
|
delete t;
|
|
}
|
|
|
|
private:
|
|
SimpleDeleter() = default;
|
|
};
|
|
|
|
template <typename T>
|
|
class SimpleDeleter<T[]> : public Cache::Deleter {
|
|
public:
|
|
static SimpleDeleter* GetInstance() {
|
|
static auto deleter = new SimpleDeleter;
|
|
return deleter;
|
|
}
|
|
|
|
void operator()(const Slice& /* key */, void* value) override {
|
|
T* const t = static_cast<T*>(value);
|
|
delete[] t;
|
|
}
|
|
|
|
private:
|
|
SimpleDeleter() = default;
|
|
};
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|