From: Lennart Poettering Date: Mon, 9 Dec 2019 17:26:10 +0000 (+0100) Subject: macro: introduce new GREEDY_ALLOC_ROUND_UP() helper X-Git-Tag: v245-rc1~289^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e49e4c33dc965b09d8d4cb95780f79de6d1d5eb5;p=thirdparty%2Fsystemd.git macro: introduce new GREEDY_ALLOC_ROUND_UP() helper --- diff --git a/src/basic/macro.h b/src/basic/macro.h index 712bb422b1c..5aa7f59c0ba 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -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