mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-29 18:33:58 +00:00
43a5cdb58c
Summary: The `#include "core_local.h"` was pulling in libgcc's `posix_memalign()` declaration. That declaration specifies `throw()` whereas musl libc's declaration does not. This was leading to the following compiler error when using musl libc: ``` In file included from /go/src/github.com/cockroachdb/cockroach/c-deps/rocksdb/port/jemalloc_helper.h:26:0, from /go/src/github.com/cockroachdb/cockroach/c-deps/rocksdb/util/jemalloc_nodump_allocator.h:11, from /go/src/github.com/cockroachdb/cockroach/c-deps/rocksdb/util/jemalloc_nodump_allocator.cc:6: /go/native/x86_64-unknown-linux-musl/jemalloc/include/jemalloc/jemalloc.h:63:29: error: declaration of 'int posix_memalign(void**, size_t, size_t) throw ()' has a different exception specifier # define je_posix_memalign posix_memalign ^ /go/native/x86_64-unknown-linux-musl/jemalloc/include/jemalloc/jemalloc.h:63:29: note: from previous declaration 'int posix_memalign(void**, size_t, size_t)' # define je_posix_memalign posix_memalign ^ /go/native/x86_64-unknown-linux-musl/jemalloc/include/jemalloc/jemalloc.h:202:38: note: in expansion of macro 'je_posix_memalign' JEMALLOC_EXPORT int JEMALLOC_NOTHROW je_posix_memalign(void **memptr, ^~~~~~~~~~~~~~~~~ make[4]: *** [CMakeFiles/rocksdb.dir/util/jemalloc_nodump_allocator.cc.o] Error 1 ``` Since `#include "core_local.h"` is not actually used, we can just remove it. I verified that fixes the build. There was a related PR here (https://github.com/facebook/rocksdb/issues/2188), although the problem description is slightly different. Pull Request resolved: https://github.com/facebook/rocksdb/pull/5583 Differential Revision: D16343227 fbshipit-source-id: 0386bc2b5fd55b2c3b5fba19382014efa52e44f8
79 lines
2.6 KiB
C++
79 lines
2.6 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 <atomic>
|
|
#include <vector>
|
|
|
|
#include "port/jemalloc_helper.h"
|
|
#include "port/port.h"
|
|
#include "rocksdb/memory_allocator.h"
|
|
#include "util/thread_local.h"
|
|
|
|
#if defined(ROCKSDB_JEMALLOC) && defined(ROCKSDB_PLATFORM_POSIX)
|
|
|
|
#include <sys/mman.h>
|
|
|
|
#if (JEMALLOC_VERSION_MAJOR >= 5) && defined(MADV_DONTDUMP)
|
|
#define ROCKSDB_JEMALLOC_NODUMP_ALLOCATOR
|
|
|
|
namespace rocksdb {
|
|
|
|
class JemallocNodumpAllocator : public MemoryAllocator {
|
|
public:
|
|
JemallocNodumpAllocator(JemallocAllocatorOptions& options,
|
|
std::unique_ptr<extent_hooks_t>&& arena_hooks,
|
|
unsigned arena_index);
|
|
~JemallocNodumpAllocator();
|
|
|
|
const char* Name() const override { return "JemallocNodumpAllocator"; }
|
|
void* Allocate(size_t size) override;
|
|
void Deallocate(void* p) override;
|
|
size_t UsableSize(void* p, size_t allocation_size) const override;
|
|
|
|
private:
|
|
friend Status NewJemallocNodumpAllocator(
|
|
JemallocAllocatorOptions& options,
|
|
std::shared_ptr<MemoryAllocator>* memory_allocator);
|
|
|
|
// Custom alloc hook to replace jemalloc default alloc.
|
|
static void* Alloc(extent_hooks_t* extent, void* new_addr, size_t size,
|
|
size_t alignment, bool* zero, bool* commit,
|
|
unsigned arena_ind);
|
|
|
|
// Destroy arena on destruction of the allocator, or on failure.
|
|
static Status DestroyArena(unsigned arena_index);
|
|
|
|
// Destroy tcache on destruction of the allocator, or thread exit.
|
|
static void DestroyThreadSpecificCache(void* ptr);
|
|
|
|
// Get or create tcache. Return flag suitable to use with `mallocx`:
|
|
// either MALLOCX_TCACHE_NONE or MALLOCX_TCACHE(tc).
|
|
int GetThreadSpecificCache(size_t size);
|
|
|
|
// A function pointer to jemalloc default alloc. Use atomic to make sure
|
|
// NewJemallocNodumpAllocator is thread-safe.
|
|
//
|
|
// Hack: original_alloc_ needs to be static for Alloc() to access it.
|
|
// alloc needs to be static to pass to jemalloc as function pointer.
|
|
static std::atomic<extent_alloc_t*> original_alloc_;
|
|
|
|
const JemallocAllocatorOptions options_;
|
|
|
|
// Custom hooks has to outlive corresponding arena.
|
|
const std::unique_ptr<extent_hooks_t> arena_hooks_;
|
|
|
|
// Arena index.
|
|
const unsigned arena_index_;
|
|
|
|
// Hold thread-local tcache index.
|
|
ThreadLocalPtr tcache_;
|
|
};
|
|
|
|
} // namespace rocksdb
|
|
#endif // (JEMALLOC_VERSION_MAJOR >= 5) && MADV_DONTDUMP
|
|
#endif // ROCKSDB_JEMALLOC && ROCKSDB_PLATFORM_POSIX
|