mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-02 09:46:37 +03:00
test: lib: add uthread test
Add a thread framework test to the lib tests. Update the API documentation to use the test as an example. Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org> Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
committed by
Tom Rini
parent
2325621fff
commit
67b1b1ae19
@@ -3,5 +3,17 @@
|
||||
Uthread API
|
||||
===========
|
||||
|
||||
.. kernel-doc:: include/uthread.h
|
||||
:doc: Overview
|
||||
|
||||
.. kernel-doc:: include/uthread.h
|
||||
:internal:
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
Here is an example of how to use this API:
|
||||
|
||||
.. literalinclude:: ../../test/lib/uthread.c
|
||||
:language: c
|
||||
:linenos:
|
||||
|
||||
@@ -32,6 +32,7 @@ obj-$(CONFIG_CRC8) += test_crc8.o
|
||||
obj-$(CONFIG_UT_LIB_CRYPT) += test_crypt.o
|
||||
obj-$(CONFIG_UT_TIME) += time.o
|
||||
obj-$(CONFIG_$(PHASE_)UT_UNICODE) += unicode.o
|
||||
obj-$(CONFIG_UTHREAD) += uthread.o
|
||||
obj-$(CONFIG_LIB_UUID) += uuid.o
|
||||
else
|
||||
obj-$(CONFIG_SANDBOX) += kconfig_spl.o
|
||||
|
||||
80
test/lib/uthread.c
Normal file
80
test/lib/uthread.c
Normal file
@@ -0,0 +1,80 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright 2025 Linaro Limited
|
||||
*
|
||||
* Unit test for uthread
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <test/lib.h>
|
||||
#include <test/ut.h>
|
||||
#include <uthread.h>
|
||||
|
||||
static int count;
|
||||
|
||||
/* A thread entry point */
|
||||
static void worker(void *arg)
|
||||
{
|
||||
int loops = (int)(unsigned long)arg;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < loops; i++) {
|
||||
count++;
|
||||
uthread_schedule();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* uthread() - testing the uthread API
|
||||
*
|
||||
* This function creates two threads with the same entry point. The first one
|
||||
* receives 5 as an argument, the second one receives 10. The number indicates
|
||||
* the number of time the worker thread should loop on uthread_schedule()
|
||||
* before returning. The workers increment a global counter each time they loop.
|
||||
* As a result the main thread knows how many times it should call
|
||||
* uthread_schedule() to let the two threads proceed, and it also knows which
|
||||
* value the counter should have at any moment.
|
||||
*/
|
||||
static int uthread(struct unit_test_state *uts)
|
||||
{
|
||||
int i;
|
||||
int id1, id2;
|
||||
|
||||
count = 0;
|
||||
id1 = uthread_grp_new_id();
|
||||
ut_assert(id1 != 0);
|
||||
id2 = uthread_grp_new_id();
|
||||
ut_assert(id2 != 0);
|
||||
ut_assert(id1 != id2);
|
||||
ut_assertok(uthread_create(NULL, worker, (void *)5, 0, id1));
|
||||
ut_assertok(uthread_create(NULL, worker, (void *)10, 0, 0));
|
||||
/*
|
||||
* The first call is expected to schedule the first worker, which will
|
||||
* schedule the second one, which will schedule back to the main thread
|
||||
* (here). Therefore count should be 2.
|
||||
*/
|
||||
ut_assert(uthread_schedule());
|
||||
ut_asserteq(2, count);
|
||||
ut_assert(!uthread_grp_done(id1));
|
||||
/* Four more calls should bring the count to 10 */
|
||||
for (i = 0; i < 4; i++) {
|
||||
ut_assert(!uthread_grp_done(id1));
|
||||
ut_assert(uthread_schedule());
|
||||
}
|
||||
ut_asserteq(10, count);
|
||||
/* This one allows the first worker to exit */
|
||||
ut_assert(uthread_schedule());
|
||||
/* At this point there should be no runnable thread in group 'id1' */
|
||||
ut_assert(uthread_grp_done(id1));
|
||||
/* Five more calls for the second worker to finish incrementing */
|
||||
for (i = 0; i < 5; i++)
|
||||
ut_assert(uthread_schedule());
|
||||
ut_asserteq(15, count);
|
||||
/* Plus one call to let the second worker return from its entry point */
|
||||
ut_assert(uthread_schedule());
|
||||
/* Now both tasks should be done, schedule should return false */
|
||||
ut_assert(!uthread_schedule());
|
||||
|
||||
return 0;
|
||||
}
|
||||
LIB_TEST(uthread, 0);
|
||||
Reference in New Issue
Block a user