Skip to content

Commit 251a8a8

Browse files
VudentzAnas Nashif
authored andcommitted
test: queue: Add test for multiple threads using k_queue_get
This tests the situation when there are multiple threads calling k_queue_get which was causing issues when using k_poll. Jira: ZEP-2553 Signed-off-by: Luiz Augusto von Dentz <[email protected]>
1 parent 7d01c5e commit 251a8a8

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

tests/kernel/queue/src/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
extern void test_queue_thread2thread(void);
1616
extern void test_queue_thread2isr(void);
1717
extern void test_queue_isr2thread(void);
18+
extern void test_queue_get_2threads(void);
1819
extern void test_queue_get_fail(void);
1920
extern void test_queue_loop(void);
2021

@@ -25,6 +26,7 @@ void test_main(void)
2526
ztest_unit_test(test_queue_thread2thread),
2627
ztest_unit_test(test_queue_thread2isr),
2728
ztest_unit_test(test_queue_isr2thread),
29+
ztest_unit_test(test_queue_get_2threads),
2830
ztest_unit_test(test_queue_get_fail),
2931
ztest_unit_test(test_queue_loop));
3032
ztest_run_test_suite(test_queue_api);

tests/kernel/queue/src/test_queue_contexts.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ static qdata_t data_sl[LIST_LEN];
3131

3232
static K_THREAD_STACK_DEFINE(tstack, STACK_SIZE);
3333
static struct k_thread tdata;
34+
static K_THREAD_STACK_DEFINE(tstack1, STACK_SIZE);
35+
static struct k_thread tdata1;
3436
static struct k_sem end_sema;
3537

3638
static void tqueue_append(struct k_queue *pqueue)
@@ -164,3 +166,43 @@ void test_queue_isr2thread(void)
164166
/**TESTPOINT: test K_QUEUE_DEFINE queue*/
165167
tqueue_isr_thread(&kqueue);
166168
}
169+
170+
static void tThread_get(void *p1, void *p2, void *p3)
171+
{
172+
zassert_true(k_queue_get((struct k_queue *)p1, K_FOREVER) != NULL,
173+
NULL);
174+
k_sem_give(&end_sema);
175+
}
176+
177+
static void tqueue_get_2threads(struct k_queue *pqueue)
178+
{
179+
k_sem_init(&end_sema, 0, 1);
180+
k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
181+
tThread_get, pqueue, NULL, NULL,
182+
K_PRIO_PREEMPT(0), 0, 0);
183+
184+
k_tid_t tid1 = k_thread_create(&tdata1, tstack1, STACK_SIZE,
185+
tThread_get, pqueue, NULL, NULL,
186+
K_PRIO_PREEMPT(0), 0, 0);
187+
188+
/* Wait threads to initialize */
189+
k_sleep(10);
190+
191+
k_queue_append(pqueue, (void *)&data[0]);
192+
k_queue_append(pqueue, (void *)&data[1]);
193+
194+
/* Wait threads to finalize */
195+
k_sem_take(&end_sema, K_FOREVER);
196+
k_sem_take(&end_sema, K_FOREVER);
197+
198+
k_thread_abort(tid);
199+
k_thread_abort(tid1);
200+
}
201+
202+
void test_queue_get_2threads(void)
203+
{
204+
/**TESTPOINT: test k_queue_init queue*/
205+
k_queue_init(&queue);
206+
207+
tqueue_get_2threads(&queue);
208+
}

0 commit comments

Comments
 (0)