proxygen
JemallocNodumpAllocator.h
Go to the documentation of this file.
1 /*
2  * Copyright 2016-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html
18 
19 #pragma once
20 
21 #include <folly/CPortability.h>
23 
24 #if defined(FOLLY_USE_JEMALLOC) && !FOLLY_SANITIZE
25 
27 #include <jemalloc/jemalloc.h>
28 
29 #if (JEMALLOC_VERSION_MAJOR > 3) && defined(MADV_DONTDUMP)
30 #define FOLLY_JEMALLOC_NODUMP_ALLOCATOR_SUPPORTED 1
31 #if (JEMALLOC_VERSION_MAJOR == 4)
32 #define FOLLY_JEMALLOC_NODUMP_ALLOCATOR_CHUNK
33 #define JEMALLOC_CHUNK_OR_EXTENT chunk
34 #else
35 #define FOLLY_JEMALLOC_NODUMP_ALLOCATOR_EXTENT
36 #define JEMALLOC_CHUNK_OR_EXTENT extent
37 #endif
38 #endif
39 
40 #endif // FOLLY_USE_JEMALLOC
41 
42 #include <cstddef>
43 
44 namespace folly {
45 
69  public:
70  enum class State {
71  ENABLED,
72  DISABLED,
73  };
74 
75  // To be used as IOBuf::FreeFunction, userData should be set to
76  // reinterpret_cast<void*>(getFlags()).
77  static void deallocate(void* p, void* userData);
78 
80 
81  void* allocate(size_t size);
82  void* reallocate(void* p, size_t size);
83  void deallocate(void* p, size_t = 0);
84 
85  unsigned getArenaIndex() const {
86  return arena_index_;
87  }
88  int getFlags() const {
89  return flags_;
90  }
91 
92  private:
93 #ifdef FOLLY_JEMALLOC_NODUMP_ALLOCATOR_SUPPORTED
94 #ifdef FOLLY_JEMALLOC_NODUMP_ALLOCATOR_CHUNK
95  static chunk_alloc_t* original_alloc_;
96  static void* alloc(
97  void* chunk,
98 #else
99  static extent_hooks_t extent_hooks_;
100  static extent_alloc_t* original_alloc_;
101  static void* alloc(
102  extent_hooks_t* extent,
103  void* new_addr,
104 #endif
105  size_t size,
106  size_t alignment,
107  bool* zero,
108  bool* commit,
109  unsigned arena_ind);
110 #endif // FOLLY_JEMALLOC_NODUMP_ALLOCATOR_SUPPORTED
111 
112  bool extend_and_setup_arena();
113 
114  unsigned arena_index_{0};
115  int flags_{0};
116 };
117 
122 
123 } // namespace folly
JemallocNodumpAllocator(State state=State::ENABLED)
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
constexpr auto size(C const &c) -> decltype(c.size())
Definition: Access.h:45
void * reallocate(void *p, size_t size)
static void deallocate(void *p, void *userData)
JemallocNodumpAllocator & globalJemallocNodumpAllocator()
void *( extent_alloc_t)(extent_hooks_t *, void *, size_t, size_t, bool *, bool *, unsigned)
state
Definition: http_parser.c:272