Introduce CacheAllocator, a custom allocator for cache blocks (#4437)
Summary:
This is a conceptually simple change, but it touches many files to
pass the allocator through function calls.
We introduce CacheAllocator, which can be used by clients to configure
custom allocator for cache blocks. Our motivation is to hook this up
with folly's `JemallocNodumpAllocator`
(f43ce6d686/folly/experimental/JemallocNodumpAllocator.h
),
but there are many other possible use cases.
Additionally, this commit cleans up memory allocation in
`util/compression.h`, making sure that all allocations are wrapped in a
unique_ptr as soon as possible.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/4437
Differential Revision: D10132814
Pulled By: yiwu-arbug
fbshipit-source-id: be1343a4b69f6048df127939fea9bbc96969f564
main
parent
4e58b2ea3d
commit
1cf5deb8fd
@ -0,0 +1,29 @@ |
||||
// 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 |
||||
|
||||
// CacheAllocator is an interface that a client can implement to supply custom
|
||||
// cache allocation and deallocation methods. See rocksdb/cache.h for more
|
||||
// information.
|
||||
// All methods should be thread-safe.
|
||||
class CacheAllocator { |
||||
public: |
||||
virtual ~CacheAllocator() = default; |
||||
|
||||
// Name of the cache allocator, printed in the log
|
||||
virtual const char* Name() const = 0; |
||||
|
||||
// Allocate a block of at least size size
|
||||
virtual void* Allocate(size_t size) = 0; |
||||
// Deallocate previously allocated block
|
||||
virtual void Deallocate(void* p) = 0; |
||||
// Returns the memory size of the block allocated at p. The default
|
||||
// implementation that just returns the original allocation_size is fine.
|
||||
virtual size_t UsableSize(void* /*p*/, size_t allocation_size) const { |
||||
// default implementation just returns the allocation size
|
||||
return allocation_size; |
||||
} |
||||
}; |
@ -0,0 +1,38 @@ |
||||
// 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_allocator.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
struct CustomDeleter { |
||||
CustomDeleter(CacheAllocator* a = nullptr) : allocator(a) {} |
||||
|
||||
void operator()(char* ptr) const { |
||||
if (allocator) { |
||||
allocator->Deallocate(reinterpret_cast<void*>(ptr)); |
||||
} else { |
||||
delete[] ptr; |
||||
} |
||||
} |
||||
|
||||
CacheAllocator* allocator; |
||||
}; |
||||
|
||||
using CacheAllocationPtr = std::unique_ptr<char[], CustomDeleter>; |
||||
|
||||
inline CacheAllocationPtr AllocateBlock(size_t size, |
||||
CacheAllocator* allocator) { |
||||
if (allocator) { |
||||
auto block = reinterpret_cast<char*>(allocator->Allocate(size)); |
||||
return CacheAllocationPtr(block, allocator); |
||||
} |
||||
return CacheAllocationPtr(new char[size]); |
||||
} |
||||
|
||||
} // namespace rocksdb
|
Loading…
Reference in new issue