diff options
author | Gunnar Beutner <gbeutner@serenityos.org> | 2021-05-15 10:06:41 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-05-15 16:30:14 +0200 |
commit | f89e8fb71a4893911ee5125f34bd5bbb99327d33 (patch) | |
tree | c22e44ba3db1066277af7bb4dbc3f49d40d903a0 /AK | |
parent | 4ab9d8736b9cb4199caed31e53ccdf30c202bee5 (diff) | |
download | serenity-f89e8fb71a4893911ee5125f34bd5bbb99327d33.zip |
AK+LibC: Implement malloc_good_size() and use it for Vector/HashTable
This implements the macOS API malloc_good_size() which returns the
true allocation size for a given requested allocation size. This
allows us to make use of all the available memory in a malloc chunk.
For example, for a malloc request of 35 bytes our malloc would
internally use a chunk of size 64, however the remaining 29 bytes
would be unused.
Knowing the true allocation size allows us to request more usable
memory that would otherwise be wasted and make that available for
Vector, HashTable and potentially other callers in the future.
Diffstat (limited to 'AK')
-rw-r--r-- | AK/HashTable.h | 1 | ||||
-rw-r--r-- | AK/Vector.h | 2 | ||||
-rw-r--r-- | AK/kmalloc.h | 7 |
3 files changed, 9 insertions, 1 deletions
diff --git a/AK/HashTable.h b/AK/HashTable.h index eac567a5d6..acfddf9b58 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<size_t>(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 74601a2a89..7acc9bdd15 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 bd5e413a37..8217fe63f1 100644 --- a/AK/kmalloc.h +++ b/AK/kmalloc.h @@ -8,6 +8,12 @@ #ifndef __serenity__ # include <new> + +# ifndef AK_OS_MACOS +inline size_t malloc_good_size(size_t size) { return size; } +# else +# include <malloc/malloc.h> +# 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 |