diff options
| author | Michael Biebl <biebl@debian.org> | 2021-10-01 23:05:04 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2021-10-01 23:05:04 +0200 |
| commit | e74c568b07b50b97873fb4ee1d776dedefbd54d6 (patch) | |
| tree | 3469f17ea9af91f7ff169b890633bda68b0cf76e /shared/nm-std-aux/nm-std-utils.c | |
| parent | bfe522304da217296e2a61040f58e35ec5d6f3f2 (diff) | |
New upstream version 1.32.12 upstream/1.32.12
Diffstat (limited to 'shared/nm-std-aux/nm-std-utils.c')
| -rw-r--r-- | shared/nm-std-aux/nm-std-utils.c | 90 |
1 files changed, 0 insertions, 90 deletions
diff --git a/shared/nm-std-aux/nm-std-utils.c b/shared/nm-std-aux/nm-std-utils.c deleted file mode 100644 index 18692b19..00000000 --- a/shared/nm-std-aux/nm-std-utils.c +++ /dev/null @@ -1,90 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -#include "nm-default-std.h" - -#include "nm-std-utils.h" - -#include <stdint.h> -#include <assert.h> -#include <limits.h> - -/*****************************************************************************/ - -size_t -nm_utils_get_next_realloc_size(bool true_realloc, size_t requested) -{ - size_t n, x; - - /* https://doc.qt.io/qt-5/containers.html#growth-strategies */ - - if (requested <= 40) { - /* small allocations. Increase in small steps of 8 bytes. - * - * We get thus sizes of 8, 16, 32, 40. */ - if (requested <= 8) - return 8; - if (requested <= 16) - return 16; - if (requested <= 32) - return 32; - - /* The return values for < 104 are essentially hard-coded, and the choice here is - * made without very strong reasons. - * - * We want to stay 24 bytes below the power-of-two border 64. Hence, return 40 here. - * However, the next step then is already 104 (128 - 24). It's a larger gap than in - * the steps before. - * - * It's not clear whether some of the steps should be adjusted (or how exactly). */ - return 40; - } - - if (requested <= 0x2000u - 24u || NM_UNLIKELY(!true_realloc)) { - /* mid sized allocations. Return next power of two, minus 24 bytes extra space - * at the beginning. - * That means, we double the size as we grow. - * - * With !true_realloc, it means that the caller does not intend to call - * realloc() but instead clone the buffer. This is for example the case, when we - * want to nm_explicit_bzero() the old buffer. In that case we really want to grow - * the buffer exponentially every time and not increment in page sizes of 4K (below). - * - * We get thus sizes of 104, 232, 488, 1000, 2024, 4072, 8168... */ - - if (NM_UNLIKELY(requested > SIZE_MAX / 2u - 24u)) - goto out_huge; - - x = requested + 24u; - n = 128u; - while (n < x) { - n <<= 1; - nm_assert(n > 128u); - } - - nm_assert(n > 24u && n - 24u >= requested); - return n - 24u; - } - - if (NM_UNLIKELY(requested > SIZE_MAX - 0x1000u - 24u)) { - /* overflow happened. */ - goto out_huge; - } - - /* For large allocations (with !true_realloc) we allocate memory in chunks of - * 4K (- 24 bytes extra), assuming that the memory gets mmapped and thus - * realloc() is efficient by just reordering pages. */ - n = ((requested + (0x0FFFu + 24u)) & ~((size_t) 0x0FFFu)) - 24u; - nm_assert(n >= requested); - return n; - -out_huge: - if (sizeof(size_t) > 4u) { - /* on s390x (64 bit), gcc with LTO can complain that the size argument to - * malloc must not be larger than 9223372036854775807. - * - * Work around that by returning SSIZE_MAX. It should be plenty still! */ - assert(requested <= (size_t) SSIZE_MAX); - return (size_t) SSIZE_MAX; - } - return SIZE_MAX; -} |