summaryrefslogtreecommitdiffstats
path: root/vespamalloc/src/vespamalloc/malloc/malloc.h
diff options
context:
space:
mode:
Diffstat (limited to 'vespamalloc/src/vespamalloc/malloc/malloc.h')
-rw-r--r--vespamalloc/src/vespamalloc/malloc/malloc.h30
1 files changed, 26 insertions, 4 deletions
diff --git a/vespamalloc/src/vespamalloc/malloc/malloc.h b/vespamalloc/src/vespamalloc/malloc/malloc.h
index b3131ac5cbb..c3d67e3a5ae 100644
--- a/vespamalloc/src/vespamalloc/malloc/malloc.h
+++ b/vespamalloc/src/vespamalloc/malloc/malloc.h
@@ -16,7 +16,7 @@ class MemoryManager : public IAllocator
{
public:
MemoryManager(size_t logLimitAtStart);
- ~MemoryManager();
+ ~MemoryManager() override;
bool initThisThread() override;
bool quitThisThread() override;
void enableThreadSupport() override;
@@ -26,9 +26,17 @@ public:
size_t getMaxNumThreads() const override { return _threadList.getMaxNumThreads(); }
void *malloc(size_t sz);
+ void *malloc(size_t sz, std::align_val_t);
void *realloc(void *oldPtr, size_t sz);
- void free(void *ptr) { freeSC(ptr, _segment.sizeClass(ptr)); }
- void free(void *ptr, size_t sz) { freeSC(ptr, MemBlockPtrT::sizeClass(sz)); }
+ void free(void *ptr) {
+ freeSC(ptr, _segment.sizeClass(ptr));
+ }
+ void free(void *ptr, size_t sz) {
+ freeSC(ptr, MemBlockPtrT::sizeClass(MemBlockPtrT::adjustSize(sz)));
+ }
+ void free(void *ptr, size_t sz, std::align_val_t alignment) {
+ freeSC(ptr, MemBlockPtrT::sizeClass(MemBlockPtrT::adjustSize(sz, alignment)));
+ }
size_t getMinSizeForAlignment(size_t align, size_t sz) const { return MemBlockPtrT::getMinSizeForAlignment(align, sz); }
size_t sizeClass(const void *ptr) const { return _segment.sizeClass(ptr); }
@@ -159,13 +167,27 @@ void * MemoryManager<MemBlockPtrT, ThreadListT>::malloc(size_t sz)
fprintf(stderr, "Memory %p(%ld) has been tampered with after free.\n", mem.ptr(), mem.size());
crash();
}
- PARANOID_CHECK2(if (!mem.validFree() && mem.ptr()) { crash(); } );
mem.setExact(sz);
mem.alloc(_prAllocLimit<=mem.adjustSize(sz));
return mem.ptr();
}
template <typename MemBlockPtrT, typename ThreadListT>
+void * MemoryManager<MemBlockPtrT, ThreadListT>::malloc(size_t sz, std::align_val_t alignment)
+{
+ MemBlockPtrT mem;
+ ThreadPool & tp = _threadList.getCurrent();
+ tp.malloc(mem.adjustSize(sz, alignment), mem);
+ if (!mem.validFree()) {
+ fprintf(stderr, "Memory %p(%ld) has been tampered with after free.\n", mem.ptr(), mem.size());
+ crash();
+ }
+ mem.setExact(sz);
+ mem.alloc(_prAllocLimit<=mem.adjustSize(sz, alignment));
+ return mem.ptr(alignment);
+}
+
+template <typename MemBlockPtrT, typename ThreadListT>
void MemoryManager<MemBlockPtrT, ThreadListT>::freeSC(void *ptr, SizeClassT sc)
{
if (MemBlockPtrT::verifySizeClass(sc)) {