mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-02 09:46:37 +03:00
abuf: Add a helper for initing and allocating a buffer
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 <sjg@chromium.org>
This commit is contained in:
@@ -449,8 +449,7 @@ int cedit_write_settings(struct expo *exp, struct abuf *buf)
|
|||||||
void *fdt;
|
void *fdt;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
abuf_init(buf);
|
if (!abuf_init_size(buf, CEDIT_SIZE_INC))
|
||||||
if (!abuf_realloc(buf, CEDIT_SIZE_INC))
|
|
||||||
return log_msg_ret("buf", -ENOMEM);
|
return log_msg_ret("buf", -ENOMEM);
|
||||||
|
|
||||||
fdt = abuf_data(buf);
|
fdt = abuf_data(buf);
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ int scene_new(struct expo *exp, const char *name, uint id, struct scene **scnp)
|
|||||||
return log_msg_ret("name", -ENOMEM);
|
return log_msg_ret("name", -ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
abuf_init(&scn->buf);
|
if (!abuf_init_size(&scn->buf, EXPO_MAX_CHARS + 1)) {
|
||||||
if (!abuf_realloc(&scn->buf, EXPO_MAX_CHARS + 1)) {
|
|
||||||
free(scn->name);
|
free(scn->name);
|
||||||
free(scn);
|
free(scn);
|
||||||
return log_msg_ret("buf", -ENOMEM);
|
return log_msg_ret("buf", -ENOMEM);
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ int scene_textline(struct scene *scn, const char *name, uint id, uint max_chars,
|
|||||||
(struct scene_obj **)&tline);
|
(struct scene_obj **)&tline);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return log_msg_ret("obj", -ENOMEM);
|
return log_msg_ret("obj", -ENOMEM);
|
||||||
abuf_init(&tline->buf);
|
if (!abuf_init_size(&tline->buf, max_chars + 1))
|
||||||
if (!abuf_realloc(&tline->buf, max_chars + 1))
|
|
||||||
return log_msg_ret("buf", -ENOMEM);
|
return log_msg_ret("buf", -ENOMEM);
|
||||||
buf = abuf_data(&tline->buf);
|
buf = abuf_data(&tline->buf);
|
||||||
*buf = '\0';
|
*buf = '\0';
|
||||||
|
|||||||
@@ -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);
|
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
|
* abuf_uninit() - Free any memory used by an abuf
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -119,6 +119,15 @@ void abuf_init_set(struct abuf *abuf, void *data, size_t size)
|
|||||||
abuf_set(abuf, data, 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)
|
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 */
|
/* for now there is no flag indicating that the abuf data is constant */
|
||||||
|
|||||||
@@ -448,8 +448,7 @@ int of_live_flatten(const struct device_node *root, struct abuf *buf)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
abuf_init(buf);
|
if (!abuf_init_size(buf, BUF_STEP))
|
||||||
if (!abuf_realloc(buf, BUF_STEP))
|
|
||||||
return log_msg_ret("ini", -ENOMEM);
|
return log_msg_ret("ini", -ENOMEM);
|
||||||
|
|
||||||
ret = fdt_create(abuf_data(buf), abuf_size(buf));
|
ret = fdt_create(abuf_data(buf), abuf_size(buf));
|
||||||
|
|||||||
@@ -419,3 +419,24 @@ static int lib_test_abuf_init(struct unit_test_state *uts)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
LIB_TEST(lib_test_abuf_init, 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;
|
||||||
|
}
|
||||||
|
LIB_TEST(lib_test_abuf_init_size, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user