zephyr/tests/kernel/msgq/msgq_api/src/main.c
Daniel Leung 32f5ef5892 tests: kernel/msgq_api: join threads after each test
On SMP systems, threads going through k_thread_abort() may still
be running while the test moves on to the next one. This creates
some interferences and may result in the next test failing. So
after each test, we need to do k_thread_join() on those threads
to make sure they are no longer active.

Signed-off-by: Daniel Leung <daniel.leung@intel.com>
2025-01-22 20:47:05 +01:00

66 lines
1.3 KiB
C

/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @defgroup kernel_message_queue_tests Message Queue
* @ingroup all_tests
* @{
* @}
*/
#include <zephyr/ztest.h>
#include "test_msgq.h"
#ifdef CONFIG_64BIT
#define MAX_SZ 256
#else
#define MAX_SZ 128
#endif
K_HEAP_DEFINE(test_pool, MAX_SZ * 2);
extern struct k_msgq kmsgq;
extern struct k_msgq msgq;
extern struct k_sem end_sema;
extern struct k_thread tdata;
extern k_tid_t tids[2];
K_THREAD_STACK_DECLARE(tstack, STACK_SIZE);
void *msgq_api_setup(void)
{
k_thread_access_grant(k_current_get(), &kmsgq, &msgq, &end_sema,
&tdata, &tstack);
k_thread_heap_assign(k_current_get(), &test_pool);
return NULL;
}
static void test_end_threads_join(void)
{
for (int i = 0; i < ARRAY_SIZE(tids); i++) {
if (tids[i] != NULL) {
k_thread_join(tids[i], K_FOREVER);
tids[i] = NULL;
}
}
}
static void msgq_api_test_after(void *data)
{
test_end_threads_join();
}
static void msgq_api_test_1cpu_after(void *data)
{
test_end_threads_join();
ztest_simple_1cpu_after(data);
}
ZTEST_SUITE(msgq_api, NULL, msgq_api_setup, NULL, msgq_api_test_after, NULL);
ZTEST_SUITE(msgq_api_1cpu, NULL, msgq_api_setup,
ztest_simple_1cpu_before, msgq_api_test_1cpu_after, NULL);