diff options
| author | Shell <[email protected]> | 2024-03-28 23:42:56 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-03-28 23:42:56 +0800 |
| commit | 83e95bdff4c48c661b50e1eec56d5fd293b28fbb (patch) | |
| tree | 9e0c2065950f0804e5009da71c8e0f590224cade /examples | |
| parent | 40e26f4909fa61ada775ba86b44d8300aaf5d250 (diff) | |
sync smart & dfs (#8672)
Signed-off-by: xqyjlj <[email protected]>
Signed-off-by: Shell <[email protected]>
Co-authored-by: xqyjlj <[email protected]>
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/utest/testcases/lwp/SConscript | 13 | ||||
| -rw-r--r-- | examples/utest/testcases/lwp/condvar_broadcast_tc.c | 156 | ||||
| -rw-r--r-- | examples/utest/testcases/lwp/condvar_signal_tc.c | 122 | ||||
| -rw-r--r-- | examples/utest/testcases/lwp/condvar_timedwait_tc.c | 76 |
4 files changed, 367 insertions, 0 deletions
diff --git a/examples/utest/testcases/lwp/SConscript b/examples/utest/testcases/lwp/SConscript new file mode 100644 index 0000000000..68fe5bea41 --- /dev/null +++ b/examples/utest/testcases/lwp/SConscript @@ -0,0 +1,13 @@ +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +src = [] +CPPPATH = [cwd] + +if GetDepend(['UTEST_LWP_TC', 'RT_USING_SMART']): + src += ['condvar_timedwait_tc.c', 'condvar_broadcast_tc.c', 'condvar_signal_tc.c'] + +group = DefineGroup('utestcases', src, depend = ['RT_USING_UTESTCASES'], CPPPATH = CPPPATH) + +Return('group') diff --git a/examples/utest/testcases/lwp/condvar_broadcast_tc.c b/examples/utest/testcases/lwp/condvar_broadcast_tc.c new file mode 100644 index 0000000000..be35c60605 --- /dev/null +++ b/examples/utest/testcases/lwp/condvar_broadcast_tc.c @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-11-20 Shell add test suites + */ + +#include "common.h" +#include "rtconfig.h" +#include "utest_assert.h" + +#include <rtdevice.h> +#include <rtdef.h> + +static struct rt_mutex _local_mtx; +static struct rt_condvar _local_cv; +#define THREAD_NUM 8 +#define STACK_SIZE (0x2000) + +static volatile int start_num; +static volatile int waken_num; + +static void thr_func(void *arg) +{ + int rc; + rt_mutex_t mutex = &_local_mtx; + rt_condvar_t cond = &_local_cv; + rt_mutex_take(mutex, RT_WAITING_FOREVER); + + start_num++; + rc = rt_condvar_timedwait(cond, mutex, RT_KILLABLE, RT_WAITING_FOREVER); + if (rc != 0) + { + LOG_E("cond_wait returned %d\n", rc); + uassert_false(1); + return; + } + + if (rt_mutex_get_owner(mutex) != rt_thread_self()) + { + LOG_E("Should not be able to lock the mutex again"); + uassert_false(1); + return; + } + else + { + uassert_true(1); + } + LOG_I("Thread was wakened and acquired the mutex again"); + waken_num++; + + if (rt_mutex_release(mutex) != 0) + { + LOG_E("Failed to release the mutex"); + uassert_false(1); + return; + } + else + { + uassert_true(1); + } + + return ; +} + +static void *stack_addr[THREAD_NUM]; + +static void condvar_broadcast_tc(void) +{ + rt_mutex_t mutex = &_local_mtx; + rt_condvar_t cond = &_local_cv; + struct rt_thread thread[THREAD_NUM]; + + for (size_t i = 0; i < THREAD_NUM; i++) + { + if (rt_thread_init(&thread[i], "utest", thr_func, RT_NULL, + stack_addr[i], STACK_SIZE, 25, 100) != 0) + { + LOG_E("Fail to create thread[%d]\n", i); + return; + } + rt_thread_startup(&thread[i]); + } + + while (start_num < THREAD_NUM) + rt_thread_mdelay(1); + + rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (rt_condvar_broadcast(cond)) + { + uassert_false(1); + return ; + } + rt_mutex_release(mutex); + + rt_thread_mdelay(1); + + if (waken_num < THREAD_NUM) + { + LOG_E("[Main thread] Not all waiters were wakened\n"); + uassert_false(1); + return ; + } + else + { + utest_int_equal(waken_num, THREAD_NUM); + } + LOG_I("[Main thread] all waiters were wakened\n"); + + return; +} + +static rt_err_t utest_tc_init(void) +{ + start_num = 0; + waken_num = 0; + if (rt_mutex_init(&_local_mtx, "utest", RT_IPC_FLAG_PRIO) != 0) + { + perror("pthread_mutex_init() error"); + uassert_false(1); + return -1; + } + + rt_condvar_init(&_local_cv, NULL); + + for (size_t i = 0; i < THREAD_NUM; i++) + { + stack_addr[i] = + rt_pages_alloc_ext(rt_page_bits(STACK_SIZE), PAGE_ANY_AVAILABLE); + utest_int_not_equal(stack_addr[i], RT_NULL); + } + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_mutex_detach(&_local_mtx); + rt_condvar_detach(&_local_cv); + + for (size_t i = 0; i < THREAD_NUM; i++) + { + rt_pages_free(stack_addr[i], rt_page_bits(STACK_SIZE)); + stack_addr[i] = 0; + } + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(condvar_broadcast_tc); +} +UTEST_TC_EXPORT(testcase, "testcases.ipc.condvar.broadcast", utest_tc_init, + utest_tc_cleanup, 10); diff --git a/examples/utest/testcases/lwp/condvar_signal_tc.c b/examples/utest/testcases/lwp/condvar_signal_tc.c new file mode 100644 index 0000000000..4bb65d423d --- /dev/null +++ b/examples/utest/testcases/lwp/condvar_signal_tc.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-11-20 Shell add test suites + */ + +#include "common.h" +#include "utest_assert.h" + +#include <rtdevice.h> +#include <rtdef.h> +#define STACK_SIZE (0x2000) + +static struct rt_mutex _local_mtx; +static struct rt_condvar _local_cv; + +static void waker_thr(void *param) +{ + int err; + rt_mutex_t mutex = &_local_mtx; + rt_condvar_t cond = &_local_cv; + rt_mutex_take(mutex, RT_WAITING_FOREVER); + err = rt_condvar_signal(cond); + + if (err != 0) + { + LOG_E("errno=%d, ret=%d\n", errno, err); + LOG_E("rt_condvar_signal() error"); + uassert_false(1); + } + else + { + uassert_false(0); + } + rt_mutex_release(mutex); + + return; +} + +static void condvar_signal_tc(void) +{ + rt_thread_t waker; + rt_mutex_t mutex = &_local_mtx; + rt_condvar_t cond = &_local_cv; + int err; + + waker = rt_thread_create("waker", waker_thr, 0, STACK_SIZE, 25, 50); + uassert_not_null(waker); + + if (rt_mutex_take(mutex, RT_WAITING_FOREVER) != 0) + { + LOG_E("pthread_mutex_lock() error"); + uassert_false(1); + return; + } + else + { + uassert_false(0); + } + + rt_thread_startup(waker); + + err = rt_condvar_timedwait(cond, mutex, RT_KILLABLE, 100); + if (err != 0) + { + if (err == -EINTR || err == -ETIMEDOUT) + { + puts("wait timed out"); + uassert_false(0); + } + else + { + LOG_E("errno=%d, ret=%d\n", errno, err); + LOG_E("pthread_cond_timedwait() error"); + uassert_false(1); + } + } + + err = rt_mutex_release(mutex); + if (err != 0) + { + LOG_E("errno=%d, ret=%d\n", errno, err); + LOG_E("rt_mutex_release() error"); + uassert_false(1); + } + else + { + uassert_false(0); + } + + return ; +} + +static rt_err_t utest_tc_init(void) +{ + if (rt_mutex_init(&_local_mtx, "utest", RT_IPC_FLAG_PRIO) != 0) + { + perror("pthread_mutex_init() error"); + uassert_false(1); + return -1; + } + + rt_condvar_init(&_local_cv, NULL); + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_mutex_detach(&_local_mtx); + rt_condvar_detach(&_local_cv); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(condvar_signal_tc); +} +UTEST_TC_EXPORT(testcase, "testcases.ipc.condvar.signal", utest_tc_init, utest_tc_cleanup, 10); diff --git a/examples/utest/testcases/lwp/condvar_timedwait_tc.c b/examples/utest/testcases/lwp/condvar_timedwait_tc.c new file mode 100644 index 0000000000..afd9418d56 --- /dev/null +++ b/examples/utest/testcases/lwp/condvar_timedwait_tc.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-11-20 Shell add test suites + */ + +#include "common.h" +#include "utest_assert.h" + +#include <rtdevice.h> +#include <rtdef.h> + +static struct rt_mutex _local_mtx; +static struct rt_condvar _local_cv; + +static void condvar_timedwait_tc(void) +{ + rt_mutex_t mutex = &_local_mtx; + rt_condvar_t cond = &_local_cv; + int err; + + if (rt_mutex_take(mutex, RT_WAITING_FOREVER) != 0) + { + LOG_E("pthread_mutex_lock() error"); + uassert_false(1); + return; + } + + err = rt_condvar_timedwait(cond, mutex, RT_KILLABLE, 100); + if (err != 0) + { + if (err == -EINTR || err == -ETIMEDOUT) + { + puts("wait timed out"); + uassert_false(0); + } + else + { + LOG_E("errno=%d, ret=%d\n", errno, err); + LOG_E("pthread_cond_timedwait() error"); + uassert_false(1); + } + } + + return ; +} + +static rt_err_t utest_tc_init(void) +{ + if (rt_mutex_init(&_local_mtx, "utest", RT_IPC_FLAG_PRIO) != 0) + { + perror("pthread_mutex_init() error"); + uassert_false(1); + return -1; + } + + rt_condvar_init(&_local_cv, NULL); + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_mutex_detach(&_local_mtx); + rt_condvar_detach(&_local_cv); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(condvar_timedwait_tc); +} +UTEST_TC_EXPORT(testcase, "testcases.ipc.condvar.timedwait", utest_tc_init, utest_tc_cleanup, 10); |
