alist: Add a function to empty the list

Sometimes it is useful to empty the list without de-allocating any of
the memory used, e.g. when the list will be re-populated immediately
afterwards.

Add a new function for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2024-10-19 09:21:46 -06:00 committed by Tom Rini
parent d785a77d18
commit 5bd4ead8bd
3 changed files with 54 additions and 0 deletions

View file

@ -274,6 +274,13 @@ bool alist_chk_ptr(const struct alist *lst, const void *ptr);
_pos < alist_end(_lst, typeof(*(_pos))); \
_pos++)
/**
* alist_empty() - Empty an alist
*
* This removes all entries from the list, without changing the allocated size
*/
void alist_empty(struct alist *lst);
/**
* alist_init() - Set up a new object list
*

View file

@ -41,6 +41,11 @@ void alist_uninit(struct alist *lst)
memset(lst, '\0', sizeof(struct alist));
}
void alist_empty(struct alist *lst)
{
lst->count = 0;
}
/**
* alist_expand_to() - Expand a list to the given size
*

View file

@ -358,6 +358,16 @@ static int lib_test_alist_for_each(struct unit_test_state *uts)
ptr = lst.data;
ut_asserteq_ptr(ptr + 3, alist_end(&lst, struct my_struct));
/* empty the list and try again */
alist_empty(&lst);
ut_asserteq_ptr(ptr, alist_end(&lst, struct my_struct));
ut_assertnull(alist_get(&lst, 0, struct my_struct));
sum = 0;
alist_for_each(ptr, &lst)
sum += ptr->val;
ut_asserteq(0, sum);
alist_uninit(&lst);
/* Check for memory leaks */
@ -366,3 +376,35 @@ static int lib_test_alist_for_each(struct unit_test_state *uts)
return 0;
}
LIB_TEST(lib_test_alist_for_each, 0);
/* Test alist_empty() */
static int lib_test_alist_empty(struct unit_test_state *uts)
{
struct my_struct data;
struct alist lst;
ulong start;
start = ut_check_free();
ut_assert(alist_init_struct(&lst, struct my_struct));
ut_asserteq(0, lst.count);
data.val = 1;
data.other_val = 0;
alist_add(&lst, data);
ut_asserteq(1, lst.count);
ut_asserteq(4, lst.alloc);
alist_empty(&lst);
ut_asserteq(0, lst.count);
ut_asserteq(4, lst.alloc);
ut_assertnonnull(lst.data);
ut_asserteq(sizeof(data), lst.obj_size);
alist_uninit(&lst);
/* Check for memory leaks */
ut_assertok(ut_check_delta(start));
return 0;
}
LIB_TEST(lib_test_alist_empty, 0);