diff --git a/AK/HashTable.h b/AK/HashTable.h index eac567a5d66..acfddf9b58e 100644 --- a/AK/HashTable.h +++ b/AK/HashTable.h @@ -258,6 +258,7 @@ private: void rehash(size_t new_capacity) { new_capacity = max(new_capacity, static_cast(4)); + new_capacity = kmalloc_good_size(new_capacity * sizeof(Bucket)) / sizeof(Bucket); auto* old_buckets = m_buckets; auto old_capacity = m_capacity; diff --git a/AK/Vector.h b/AK/Vector.h index 74601a2a89c..7acc9bdd154 100644 --- a/AK/Vector.h +++ b/AK/Vector.h @@ -563,7 +563,7 @@ public: { if (m_capacity >= needed_capacity) return true; - size_t new_capacity = needed_capacity; + size_t new_capacity = kmalloc_good_size(needed_capacity * sizeof(T)) / sizeof(T); auto* new_buffer = (T*)kmalloc(new_capacity * sizeof(T)); if (new_buffer == nullptr) return false; diff --git a/AK/kmalloc.h b/AK/kmalloc.h index bd5e413a373..8217fe63f18 100644 --- a/AK/kmalloc.h +++ b/AK/kmalloc.h @@ -8,6 +8,12 @@ #ifndef __serenity__ # include + +# ifndef AK_OS_MACOS +inline size_t malloc_good_size(size_t size) { return size; } +# else +# include +# endif #endif #ifdef KERNEL @@ -27,6 +33,7 @@ # define kcalloc calloc # define kmalloc malloc +# define kmalloc_good_size malloc_good_size # define kfree free # define krealloc realloc diff --git a/Kernel/Heap/kmalloc.cpp b/Kernel/Heap/kmalloc.cpp index 1e96825f87e..c7759f4ad77 100644 --- a/Kernel/Heap/kmalloc.cpp +++ b/Kernel/Heap/kmalloc.cpp @@ -277,6 +277,11 @@ void* krealloc(void* ptr, size_t new_size) return g_kmalloc_global->m_heap.reallocate(ptr, new_size); } +size_t kmalloc_good_size(size_t size) +{ + return size; +} + void* operator new(size_t size) noexcept { return kmalloc(size); diff --git a/Kernel/Heap/kmalloc.h b/Kernel/Heap/kmalloc.h index 6fdc974c32a..624758ea530 100644 --- a/Kernel/Heap/kmalloc.h +++ b/Kernel/Heap/kmalloc.h @@ -66,4 +66,6 @@ inline void kfree_aligned(void* ptr) kfree((u8*)ptr - ((const ptrdiff_t*)ptr)[-1]); } +size_t kmalloc_good_size(size_t); + void kmalloc_enable_expand(); diff --git a/Userland/Libraries/LibC/malloc.cpp b/Userland/Libraries/LibC/malloc.cpp index c175c02daf7..43519cf296c 100644 --- a/Userland/Libraries/LibC/malloc.cpp +++ b/Userland/Libraries/LibC/malloc.cpp @@ -392,6 +392,13 @@ size_t malloc_size(void* ptr) return size; } +size_t malloc_good_size(size_t size) +{ + size_t good_size; + allocator_for_size(size, good_size); + return good_size; +} + void* realloc(void* ptr, size_t size) { if (!ptr) diff --git a/Userland/Libraries/LibC/stdlib.h b/Userland/Libraries/LibC/stdlib.h index 480e570cc74..c63e7eebc5f 100644 --- a/Userland/Libraries/LibC/stdlib.h +++ b/Userland/Libraries/LibC/stdlib.h @@ -21,6 +21,7 @@ __BEGIN_DECLS __attribute__((malloc)) __attribute__((alloc_size(1))) void* malloc(size_t); __attribute__((malloc)) __attribute__((alloc_size(1, 2))) void* calloc(size_t nmemb, size_t); size_t malloc_size(void*); +size_t malloc_good_size(size_t); void serenity_dump_malloc_stats(void); void free(void*); __attribute__((alloc_size(2))) void* realloc(void* ptr, size_t);