This construct appears in various places. Reduce code size by adding a function for it.
It inits the abuf, then allocates it to the requested size. Signed-off-by: Simon Glass <s...@chromium.org> --- Changes in v2: - Add new patch with a helper for initing and allocating a buffer boot/cedit.c | 3 +-- boot/scene.c | 3 +-- boot/scene_textline.c | 3 +-- include/abuf.h | 11 +++++++++++ lib/abuf.c | 9 +++++++++ lib/of_live.c | 3 +-- test/lib/abuf.c | 22 ++++++++++++++++++++++ 7 files changed, 46 insertions(+), 8 deletions(-) diff --git a/boot/cedit.c b/boot/cedit.c index d69290c172e..4e80875828b 100644 --- a/boot/cedit.c +++ b/boot/cedit.c @@ -449,8 +449,7 @@ int cedit_write_settings(struct expo *exp, struct abuf *buf) void *fdt; int ret; - abuf_init(buf); - if (!abuf_realloc(buf, CEDIT_SIZE_INC)) + if (!abuf_init_size(buf, CEDIT_SIZE_INC)) return log_msg_ret("buf", -ENOMEM); fdt = abuf_data(buf); diff --git a/boot/scene.c b/boot/scene.c index 3290a40222a..9034aeeecf2 100644 --- a/boot/scene.c +++ b/boot/scene.c @@ -31,8 +31,7 @@ int scene_new(struct expo *exp, const char *name, uint id, struct scene **scnp) return log_msg_ret("name", -ENOMEM); } - abuf_init(&scn->buf); - if (!abuf_realloc(&scn->buf, EXPO_MAX_CHARS + 1)) { + if (!abuf_init_size(&scn->buf, EXPO_MAX_CHARS + 1)) { free(scn->name); free(scn); return log_msg_ret("buf", -ENOMEM); diff --git a/boot/scene_textline.c b/boot/scene_textline.c index 6adef7cc173..90642a3f03d 100644 --- a/boot/scene_textline.c +++ b/boot/scene_textline.c @@ -31,8 +31,7 @@ int scene_textline(struct scene *scn, const char *name, uint id, uint max_chars, (struct scene_obj **)&tline); if (ret < 0) return log_msg_ret("obj", -ENOMEM); - abuf_init(&tline->buf); - if (!abuf_realloc(&tline->buf, max_chars + 1)) + if (!abuf_init_size(&tline->buf, max_chars + 1)) return log_msg_ret("buf", -ENOMEM); buf = abuf_data(&tline->buf); *buf = '\0'; diff --git a/include/abuf.h b/include/abuf.h index 62ff6499a0c..749bb188b0c 100644 --- a/include/abuf.h +++ b/include/abuf.h @@ -170,6 +170,17 @@ void abuf_init_set(struct abuf *abuf, void *data, size_t size); */ void abuf_init_const(struct abuf *abuf, const void *data, size_t size); +/** + * abuf_init_size() - Set up an allocated abuf + * + * Init a new abuf and allocate its size. + * + * @abuf: abuf to set up + * @data: New contents of abuf + * @size: New size of abuf + */ +bool abuf_init_size(struct abuf *buf, size_t size); + /** * abuf_uninit() - Free any memory used by an abuf * diff --git a/lib/abuf.c b/lib/abuf.c index 61adf7fc6b1..3cbe320fb08 100644 --- a/lib/abuf.c +++ b/lib/abuf.c @@ -119,6 +119,15 @@ void abuf_init_set(struct abuf *abuf, void *data, size_t size) abuf_set(abuf, data, size); } +bool abuf_init_size(struct abuf *buf, size_t size) +{ + abuf_init(buf); + if (!abuf_realloc(buf, size)) + return false; + + return true; +} + void abuf_init_const(struct abuf *abuf, const void *data, size_t size) { /* for now there is no flag indicating that the abuf data is constant */ diff --git a/lib/of_live.c b/lib/of_live.c index bc8c73c6f36..470a687047b 100644 --- a/lib/of_live.c +++ b/lib/of_live.c @@ -448,8 +448,7 @@ int of_live_flatten(const struct device_node *root, struct abuf *buf) { int ret; - abuf_init(buf); - if (!abuf_realloc(buf, BUF_STEP)) + if (!abuf_init_size(buf, BUF_STEP)) return log_msg_ret("ini", -ENOMEM); ret = fdt_create(abuf_data(buf), abuf_size(buf)); diff --git a/test/lib/abuf.c b/test/lib/abuf.c index b38690fe1a9..916577ee3ea 100644 --- a/test/lib/abuf.c +++ b/test/lib/abuf.c @@ -419,3 +419,25 @@ static int lib_test_abuf_init(struct unit_test_state *uts) return 0; } LIB_TEST(lib_test_abuf_init, 0); + +/* Test abuf_init_size() */ +static int lib_test_abuf_init_size(struct unit_test_state *uts) +{ + struct abuf buf; + ulong start; + + start = ut_check_free(); + + ut_assert(abuf_init_size(&buf, TEST_DATA_LEN)); + ut_assertnonnull(buf.data); + ut_asserteq(TEST_DATA_LEN, buf.size); + ut_asserteq(true, buf.alloced); + abuf_uninit(&buf); + + /* Check for memory leaks */ + ut_assertok(ut_check_delta(start)); + + return 0; + return 0; +} +LIB_TEST(lib_test_abuf_init_size, 0); -- 2.43.0