summaryrefslogtreecommitdiffstats
path: root/vespamalloc/src/vespamalloc
diff options
context:
space:
mode:
Diffstat (limited to 'vespamalloc/src/vespamalloc')
-rw-r--r--vespamalloc/src/vespamalloc/malloc/malloc.h8
-rw-r--r--vespamalloc/src/vespamalloc/malloc/overload.h7
-rw-r--r--vespamalloc/src/vespamalloc/malloc/threadpool.h2
-rw-r--r--vespamalloc/src/vespamalloc/malloc/threadpool.hpp11
4 files changed, 26 insertions, 2 deletions
diff --git a/vespamalloc/src/vespamalloc/malloc/malloc.h b/vespamalloc/src/vespamalloc/malloc/malloc.h
index 8e0a39e944b..449dce29896 100644
--- a/vespamalloc/src/vespamalloc/malloc/malloc.h
+++ b/vespamalloc/src/vespamalloc/malloc/malloc.h
@@ -25,6 +25,7 @@ public:
}
size_t getMaxNumThreads() const override { return _threadList.getMaxNumThreads(); }
+ int mallopt(int param, int value);
void *malloc(size_t sz);
void *malloc(size_t sz, std::align_val_t);
void *realloc(void *oldPtr, size_t sz);
@@ -149,6 +150,11 @@ void MemoryManager<MemBlockPtrT, ThreadListT>::info(FILE * os, size_t level)
}
template <typename MemBlockPtrT, typename ThreadListT>
+int MemoryManager<MemBlockPtrT, ThreadListT>::mallopt(int param, int value) {
+ return _threadList.getCurrent().mallopt(param, value);
+}
+
+template <typename MemBlockPtrT, typename ThreadListT>
void * MemoryManager<MemBlockPtrT, ThreadListT>::malloc(size_t sz)
{
MemBlockPtrT mem;
@@ -205,7 +211,7 @@ void MemoryManager<MemBlockPtrT, ThreadListT>::freeSC(void *ptr, SizeClassT sc)
template <typename MemBlockPtrT, typename ThreadListT>
void * MemoryManager<MemBlockPtrT, ThreadListT>::realloc(void *oldPtr, size_t sz)
{
- void *ptr(NULL);
+ void *ptr(nullptr);
if (oldPtr) {
MemBlockPtrT mem(oldPtr);
mem.readjustAlignment(_segment);
diff --git a/vespamalloc/src/vespamalloc/malloc/overload.h b/vespamalloc/src/vespamalloc/malloc/overload.h
index 69d95ef5cdc..7d9c2b9c72e 100644
--- a/vespamalloc/src/vespamalloc/malloc/overload.h
+++ b/vespamalloc/src/vespamalloc/malloc/overload.h
@@ -4,7 +4,7 @@
#include <dlfcn.h>
#include <errno.h>
#include <new>
-#include <stdlib.h>
+#include <cstdlib>
#include <malloc.h>
class CreateAllocator
@@ -140,6 +140,11 @@ struct mallinfo mallinfo() __THROW {
}
#endif
+int mallopt(int param, int value) throw() __attribute((visibility("default")));
+int mallopt(int param, int value) throw() {
+ return vespamalloc::createAllocator()->mallopt(param, value);
+}
+
void * malloc(size_t sz) __attribute((visibility("default")));
void * malloc(size_t sz) {
return vespamalloc::createAllocator()->malloc(sz);
diff --git a/vespamalloc/src/vespamalloc/malloc/threadpool.h b/vespamalloc/src/vespamalloc/malloc/threadpool.h
index ac4f5bb8551..ec89079a415 100644
--- a/vespamalloc/src/vespamalloc/malloc/threadpool.h
+++ b/vespamalloc/src/vespamalloc/malloc/threadpool.h
@@ -19,6 +19,7 @@ public:
void setPool(AllocPool & pool) {
_allocPool = & pool;
}
+ int mallopt(int param, int value);
void malloc(size_t sz, MemBlockPtrT & mem);
void free(MemBlockPtrT mem, SizeClassT sc);
@@ -65,6 +66,7 @@ private:
static constexpr bool alwaysReuse(SizeClassT sc) { return sc > ALWAYS_REUSE_SC_LIMIT; }
AllocPool * _allocPool;
+ ssize_t _mmapLimit;
AllocFree _memList[NUM_SIZE_CLASSES];
ThreadStatT _stat[NUM_SIZE_CLASSES];
uint32_t _threadId;
diff --git a/vespamalloc/src/vespamalloc/malloc/threadpool.hpp b/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
index 7e86c3f691a..e9b9fabebdc 100644
--- a/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
+++ b/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
@@ -2,6 +2,7 @@
#pragma once
#include <vespamalloc/malloc/threadpool.h>
+#include <malloc.h>
namespace vespamalloc {
@@ -85,6 +86,7 @@ mallocHelper(size_t exactSize,
template <typename MemBlockPtrT, typename ThreadStatT >
ThreadPoolT<MemBlockPtrT, ThreadStatT>::ThreadPoolT() :
_allocPool(nullptr),
+ _mmapLimit(0x40000000),
_threadId(0),
_osThreadId(0)
{
@@ -94,6 +96,15 @@ template <typename MemBlockPtrT, typename ThreadStatT >
ThreadPoolT<MemBlockPtrT, ThreadStatT>::~ThreadPoolT() = default;
template <typename MemBlockPtrT, typename ThreadStatT >
+int ThreadPoolT<MemBlockPtrT, ThreadStatT>::mallopt(int param, int value) {
+ if (param == M_MMAP_THRESHOLD) {
+ _mmapLimit = value;
+ return 1;
+ }
+ return 0;
+}
+
+template <typename MemBlockPtrT, typename ThreadStatT >
void ThreadPoolT<MemBlockPtrT, ThreadStatT>::malloc(size_t sz, MemBlockPtrT & mem)
{
SizeClassT sc = MemBlockPtrT::sizeClass(sz);