From: Mark Wooding Date: Tue, 9 Jul 2024 17:07:01 +0000 (+0100) Subject: @@@ tvec buffer align power-of-two X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/commitdiff_plain/c70f2c2c1135366f8fc41575e741c2482b0a3948?ds=inline @@@ tvec buffer align power-of-two --- diff --git a/test/tvec-types.c b/test/tvec-types.c index 27381b5..9e7a35f 100644 --- a/test/tvec-types.c +++ b/test/tvec-types.c @@ -3976,17 +3976,18 @@ void tvec_initbuffer(union tvec_regval *rv, void tvec_allocbuffer(union tvec_regval *rv) { unsigned char *p; size_t n; + size_t m = rv->buf.m, a = rv->buf.a, off; if (rv->buf.p) free(rv->buf.p - rv->buf.off); - if (rv->buf.m < 2) { - rv->buf.p = x_alloc(&arena_stdlib, rv->buf.sz); rv->buf.off = 0; + if (m < 2) { + p = x_alloc(&arena_stdlib, rv->buf.sz); off = 0; } else { - p = x_alloc(&arena_stdlib, rv->buf.sz + rv->buf.m - 1); - n = (size_t)p%rv->buf.m; - rv->buf.off = (rv->buf.a - n + rv->buf.m)%rv->buf.m; - rv->buf.p = p + rv->buf.off; + p = x_alloc(&arena_stdlib, rv->buf.sz + m - 1); + if (!(m&(m - 1))) off = (a - (size_t)p)&(m - 1); + else off = (a + m - (size_t)p%m)%m; } + rv->buf.p = p + off; rv->buf.off = off; memset(rv->buf.p, '?', rv->buf.sz); }