diff options
| author | gingerBill <bill@gingerbill.org> | 2021-08-07 14:25:48 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-08-07 14:25:48 +0100 |
| commit | 571170fd30b116c2b6cf40835c2f4779631741cf (patch) | |
| tree | 7f27abcd08278677e09242f692791e1e2891e6d7 /src/array.cpp | |
| parent | 911c428dacdeda1667147861a0b055068b543b72 (diff) | |
Improve and simplify the memory layout of `MPMCQueue`
Diffstat (limited to 'src/array.cpp')
| -rw-r--r-- | src/array.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/array.cpp b/src/array.cpp index a7c9204b0..a2c802168 100644 --- a/src/array.cpp +++ b/src/array.cpp @@ -326,12 +326,17 @@ void array_set_capacity(Array<T> *array, isize capacity) { array_resize(array, capacity); } - T *new_data = nullptr; - if (capacity > 0) { - new_data = gb_alloc_array(array->allocator, T, capacity); - gb_memmove(new_data, array->data, gb_size_of(T) * array->capacity); + // NOTE(bill): try gb_resize_align first, and then fallback to alloc+memmove+free + isize old_size = array->capacity * gb_size_of(T); + isize new_size = capacity * gb_size_of(T); + T *new_data = cast(T *)gb_resize_align(array->allocator, array->data, old_size, new_size, gb_align_of(T)); + if (new_data == nullptr) { + if (capacity > 0) { + new_data = gb_alloc_array(array->allocator, T, capacity); + gb_memmove(new_data, array->data, gb_size_of(T) * array->capacity); + } + gb_free(array->allocator, array->data); } - gb_free(array->allocator, array->data); array->data = new_data; array->capacity = capacity; } |