]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
macro: introduce new GREEDY_ALLOC_ROUND_UP() helper
authorLennart Poettering <lennart@poettering.net>
Mon, 9 Dec 2019 17:26:10 +0000 (18:26 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 9 Dec 2019 17:35:10 +0000 (18:35 +0100)
src/basic/macro.h

index 712bb422b1c2362202e635bd58832a972c131a1c..5aa7f59c0ba1fc5c0f8391dc71d64d0dbb7d4c63 100644 (file)
@@ -179,6 +179,29 @@ static inline unsigned long ALIGN_POWER2(unsigned long u) {
         return 1UL << (sizeof(u) * 8 - __builtin_clzl(u - 1UL));
 }
 
+static inline size_t GREEDY_ALLOC_ROUND_UP(size_t l) {
+        size_t m;
+
+        /* Round up allocation sizes a bit to some reasonable, likely larger value. This is supposed to be
+         * used for cases which are likely called in an allocation loop of some form, i.e. that repetitively
+         * grow stuff, for example strv_extend() and suchlike.
+         *
+         * Note the difference to GREEDY_REALLOC() here, as this helper operates on a single size value only,
+         * and rounds up to next multiple of 2, needing no further counter.
+         *
+         * Note the benefits of direct ALIGN_POWER2() usage: type-safety for size_t, sane handling for very
+         * small (i.e. <= 2) and safe handling for very large (i.e. > SSIZE_MAX) values. */
+
+        if (l <= 2)
+                return 2; /* Never allocate less than 2 of something.  */
+
+        m = ALIGN_POWER2(l);
+        if (m == 0) /* overflow? */
+                return l;
+
+        return m;
+}
+
 #ifndef __COVERITY__
 #  define VOID_0 ((void)0)
 #else