diff mbox series

[RFC,10/10] test: lib: add uthread test

Message ID 20250214140031.484344-11-jerome.forissier@linaro.org
State New
Headers show
Series Uthreads | expand

Commit Message

Jerome Forissier Feb. 14, 2025, 2 p.m. UTC
Test uthread scheduling.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 lib/uthread.c      |  3 ++-
 test/lib/Makefile  |  1 +
 test/lib/uthread.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+), 1 deletion(-)
 create mode 100644 test/lib/uthread.c

Comments

Yao Zi Feb. 14, 2025, 6:41 p.m. UTC | #1
On Fri, Feb 14, 2025 at 03:00:25PM +0100, Jerome Forissier wrote:
> Test uthread scheduling.
> 
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  lib/uthread.c      |  3 ++-
>  test/lib/Makefile  |  1 +
>  test/lib/uthread.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 61 insertions(+), 1 deletion(-)
>  create mode 100644 test/lib/uthread.c
> 
> diff --git a/lib/uthread.c b/lib/uthread.c
> index bb132001fb6..1f8e6d0fa80 100644
> --- a/lib/uthread.c
> +++ b/lib/uthread.c
> @@ -76,10 +76,11 @@ err:
>  
>  void uthread_free_all(void)
>  {
> +	struct uthread *main = &main_thread;
>  	struct uthread *next;
>  	struct uthread *tmp;
>  
> -	list_for_each_entry_safe(next, tmp, &current->list, list) {
> +	list_for_each_entry_safe(next, tmp, &main->list, list) {
>  		list_del(&next->list);
>  		uthread_free(next);
>  	}

I think this should belong to the sixth patch.

> diff --git a/test/lib/Makefile b/test/lib/Makefile
> index bf04685dae1..c991dff1c63 100644
> --- a/test/lib/Makefile
> +++ b/test/lib/Makefile
> ...

Best regards,
Yao Zi
Jerome Forissier Feb. 17, 2025, 9:49 a.m. UTC | #2
On 2/14/25 19:41, Yao Zi wrote:
> On Fri, Feb 14, 2025 at 03:00:25PM +0100, Jerome Forissier wrote:
>> Test uthread scheduling.
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  lib/uthread.c      |  3 ++-
>>  test/lib/Makefile  |  1 +
>>  test/lib/uthread.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 61 insertions(+), 1 deletion(-)
>>  create mode 100644 test/lib/uthread.c
>>
>> diff --git a/lib/uthread.c b/lib/uthread.c
>> index bb132001fb6..1f8e6d0fa80 100644
>> --- a/lib/uthread.c
>> +++ b/lib/uthread.c
>> @@ -76,10 +76,11 @@ err:
>>  
>>  void uthread_free_all(void)
>>  {
>> +	struct uthread *main = &main_thread;
>>  	struct uthread *next;
>>  	struct uthread *tmp;
>>  
>> -	list_for_each_entry_safe(next, tmp, &current->list, list) {
>> +	list_for_each_entry_safe(next, tmp, &main->list, list) {
>>  		list_del(&next->list);
>>  		uthread_free(next);
>>  	}
> 
> I think this should belong to the sixth patch.

Absolutely. I'll fix in v2.

> 
>> diff --git a/test/lib/Makefile b/test/lib/Makefile
>> index bf04685dae1..c991dff1c63 100644
>> --- a/test/lib/Makefile
>> +++ b/test/lib/Makefile
>> ...
> 
> Best regards,
> Yao Zi

Thanks,
diff mbox series

Patch

diff --git a/lib/uthread.c b/lib/uthread.c
index bb132001fb6..1f8e6d0fa80 100644
--- a/lib/uthread.c
+++ b/lib/uthread.c
@@ -76,10 +76,11 @@  err:
 
 void uthread_free_all(void)
 {
+	struct uthread *main = &main_thread;
 	struct uthread *next;
 	struct uthread *tmp;
 
-	list_for_each_entry_safe(next, tmp, &current->list, list) {
+	list_for_each_entry_safe(next, tmp, &main->list, list) {
 		list_del(&next->list);
 		uthread_free(next);
 	}
diff --git a/test/lib/Makefile b/test/lib/Makefile
index bf04685dae1..c991dff1c63 100644
--- a/test/lib/Makefile
+++ b/test/lib/Makefile
@@ -31,6 +31,7 @@  obj-$(CONFIG_CRC8) += test_crc8.o
 obj-$(CONFIG_UT_LIB_CRYPT) += test_crypt.o
 obj-$(CONFIG_UT_TIME) += time.o
 obj-$(CONFIG_$(XPL_)UT_UNICODE) += unicode.o
+obj-$(CONFIG_UTHREAD) += uthread.o
 obj-$(CONFIG_LIB_UUID) += uuid.o
 else
 obj-$(CONFIG_SANDBOX) += kconfig_spl.o
diff --git a/test/lib/uthread.c b/test/lib/uthread.c
new file mode 100644
index 00000000000..c9d030dc778
--- /dev/null
+++ b/test/lib/uthread.c
@@ -0,0 +1,58 @@ 
+// 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;
+
+static void worker(void *arg)
+{
+	int loops = (int)(unsigned long)arg;
+	int i;
+
+	for (i = 0; i < loops; i++) {
+		count++;
+		uthread_schedule();
+	}
+}
+
+static int lib_uthread(struct unit_test_state *uts)
+{
+	int i;
+
+	count = 0;
+	ut_assertok(uthread_create(worker, (void *)5, 0));
+	ut_assertok(uthread_create(worker, (void *)10, 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);
+	/* Four more calls should bring the count to 10 */
+	for (i = 0; i < 4; i++)
+		ut_assert(uthread_schedule());
+	ut_asserteq(10, count);
+	/* This one allows the first worker to exit */
+	ut_assert(uthread_schedule());
+	/* 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());
+	uthread_free_all();
+
+	return 0;
+}
+LIB_TEST(lib_uthread, 0);