Skip to content

Commit 8934b81

Browse files
Mattemagikernkartben
authored andcommitted
tests: kernel: Add support for stopping workqueues
This patch adds tests for stopping workqueues. Signed-off-by: Måns Ansgariusson <[email protected]>
1 parent 7545e8d commit 8934b81

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* Copyright (c) 2024 Måns Ansgariusson <[email protected]>
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/kernel.h>
8+
#include <zephyr/ztest.h>
9+
10+
#define NUM_TEST_ITEMS 10
11+
/* In fact, each work item could take up to this value */
12+
#define WORK_ITEM_WAIT_ALIGNED \
13+
k_ticks_to_ms_floor64(k_ms_to_ticks_ceil32(CONFIG_TEST_WORK_ITEM_WAIT_MS) + _TICK_ALIGN)
14+
#define CHECK_WAIT ((NUM_TEST_ITEMS + 1) * WORK_ITEM_WAIT_ALIGNED)
15+
16+
static K_THREAD_STACK_DEFINE(work_q_stack, 1024 + CONFIG_TEST_EXTRA_STACK_SIZE);
17+
18+
static void work_handler(struct k_work *work)
19+
{
20+
ARG_UNUSED(work);
21+
k_msleep(CONFIG_TEST_WORK_ITEM_WAIT_MS);
22+
}
23+
24+
ZTEST(workqueue_api, test_k_work_queue_stop)
25+
{
26+
size_t i;
27+
struct k_work work;
28+
struct k_work_q work_q;
29+
struct k_work works[NUM_TEST_ITEMS];
30+
struct k_work_queue_config cfg = {
31+
.name = "test_work_q",
32+
.no_yield = true,
33+
};
34+
35+
zassert_equal(k_work_queue_stop(&work_q, K_FOREVER), -EALREADY,
36+
"Succeeded to stop work queue on non-initialized work queue");
37+
k_work_queue_start(&work_q, work_q_stack, K_THREAD_STACK_SIZEOF(work_q_stack),
38+
K_PRIO_PREEMPT(4), &cfg);
39+
40+
for (i = 0; i < NUM_TEST_ITEMS; i++) {
41+
k_work_init(&works[i], work_handler);
42+
zassert_equal(k_work_submit_to_queue(&work_q, &works[i]), 1,
43+
"Failed to submit work item");
44+
}
45+
46+
/* Wait for the work item to complete */
47+
k_sleep(K_MSEC(CHECK_WAIT));
48+
49+
zassert_equal(k_work_queue_stop(&work_q, K_FOREVER), -EBUSY,
50+
"Succeeded to stop work queue while it is running & not plugged");
51+
zassert_true(k_work_queue_drain(&work_q, true) >= 0, "Failed to drain & plug work queue");
52+
zassert_ok(k_work_queue_stop(&work_q, K_FOREVER), "Failed to stop work queue");
53+
54+
k_work_init(&work, work_handler);
55+
zassert_equal(k_work_submit_to_queue(&work_q, &work), -ENODEV,
56+
"Succeeded to submit work item to non-initialized work queue");
57+
}
58+
59+
ZTEST_SUITE(workqueue_api, NULL, NULL, NULL, NULL, NULL);

0 commit comments

Comments
 (0)