diff options
Diffstat (limited to 'vespamalloc/src/vespamalloc/malloc/malloc.h')
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/malloc.h | 30 |
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)) { |