u_dynarray: turn util_dynarray_{grow, resize} into element-oriented macros
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 13 May 2019 14:58:08 +0000 (16:58 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 12 Jun 2019 22:30:25 +0000 (18:30 -0400)
commitde8a919702a377207e83434ab40d91c3013ed96c
treeba800d0375de39a447a6690b448ae52807ab01f3
parent71b45bae14be84ab09212c9ded758fa31e31e945
u_dynarray: turn util_dynarray_{grow, resize} into element-oriented macros

The main motivation for this change is API ergonomics: most operations
on dynarrays are really on elements, not on bytes, so it's weird to have
grow and resize as the odd operations out.

The secondary motivation is memory safety. Users of the old byte-oriented
functions would often multiply a number of elements with the element size,
which could overflow, and checking for overflow is tedious.

With this change, we only need to implement the overflow checks once.
The checks are cheap: since eltsize is a compile-time constant and the
functions should be inlined, they only add a single comparison and an
unlikely branch.

v2:
- ensure operations are no-op when allocation fails
- in util_dynarray_clone, call resize_bytes with a compile-time constant element size

v3:
- fix iris, lima, panfrost

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/iris/iris_fence.c
src/gallium/drivers/lima/lima_draw.c
src/gallium/drivers/lima/lima_submit.c
src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c
src/gallium/drivers/nouveau/nv50/nv50_state.c
src/gallium/drivers/nouveau/nvc0/nvc0_state.c
src/gallium/drivers/panfrost/midgard/midgard_emit.c
src/intel/compiler/brw_nir_analyze_ubo_ranges.c
src/mesa/drivers/dri/i965/brw_bufmgr.c
src/util/u_dynarray.h