@@ -18,12 +18,14 @@ struct fifo_msg {
1818#define MSGQ_MSG_SIZE 4
1919#define MSGQ_MAX_MSGS 16
2020#define MSGQ_MSG_VALUE {'a', 'b', 'c', 'd'}
21+ #define PIPE_DATA "atad_epip"
2122#define STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
2223
2324/* verify k_poll() without waiting */
2425static struct k_sem no_wait_sem ;
2526static struct k_fifo no_wait_fifo ;
2627static struct k_poll_signal no_wait_signal ;
28+ K_PIPE_DEFINE (no_wait_pipe , 32 , 1 );
2729static struct k_poll_signal test_signal ;
2830#ifndef CONFIG_USERSPACE
2931static struct k_msgq no_wait_msgq ;
@@ -63,6 +65,7 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
6365 unsigned int signaled ;
6466 char msgq_recv_buf [MSGQ_MSG_SIZE ] = {0 };
6567 char msgq_msg [MSGQ_MSG_SIZE ] = MSGQ_MSG_VALUE ;
68+ char pipe_recv_buf [sizeof (PIPE_DATA ) + 4 ];
6669 int result ;
6770 struct k_msgq * mq ;
6871#ifdef CONFIG_USERSPACE
@@ -78,6 +81,8 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
7881
7982 k_msgq_alloc_init (mq , MSGQ_MSG_SIZE , MSGQ_MAX_MSGS );
8083
84+ k_pipe_write (& no_wait_pipe , PIPE_DATA , sizeof (PIPE_DATA ), K_NO_WAIT );
85+
8186 struct k_poll_event events [] = {
8287 K_POLL_EVENT_INITIALIZER (K_POLL_TYPE_SEM_AVAILABLE ,
8388 K_POLL_MODE_NOTIFY_ONLY ,
@@ -94,6 +99,9 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
9499 K_POLL_EVENT_INITIALIZER (K_POLL_TYPE_MSGQ_DATA_AVAILABLE ,
95100 K_POLL_MODE_NOTIFY_ONLY ,
96101 mq ),
102+ K_POLL_EVENT_INITIALIZER (K_POLL_TYPE_PIPE_DATA_AVAILABLE ,
103+ K_POLL_MODE_NOTIFY_ONLY ,
104+ & no_wait_pipe ),
97105 };
98106
99107#ifdef CONFIG_USERSPACE
@@ -159,12 +167,18 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
159167 zassert_false (k_msgq_get (mq , msgq_recv_buf , K_NO_WAIT ));
160168 zassert_false (memcmp (msgq_msg , msgq_recv_buf , MSGQ_MSG_SIZE ), "" );
161169
170+ zassert_equal (events [5 ].state , K_POLL_STATE_PIPE_DATA_AVAILABLE );
171+ result = k_pipe_read (& no_wait_pipe , pipe_recv_buf , sizeof (pipe_recv_buf ), K_NO_WAIT );
172+ zassert_equal (result , sizeof (PIPE_DATA ));
173+ zassert_str_equal (pipe_recv_buf , PIPE_DATA );
174+
162175 /* verify events are not ready anymore (user has to clear them first) */
163176 events [0 ].state = K_POLL_STATE_NOT_READY ;
164177 events [1 ].state = K_POLL_STATE_NOT_READY ;
165178 events [2 ].state = K_POLL_STATE_NOT_READY ;
166179 events [3 ].state = K_POLL_STATE_NOT_READY ;
167180 events [4 ].state = K_POLL_STATE_NOT_READY ;
181+ events [5 ].state = K_POLL_STATE_NOT_READY ;
168182 k_poll_signal_reset (& no_wait_signal );
169183
170184 zassert_equal (k_poll (events , ARRAY_SIZE (events ), K_NO_WAIT ), - EAGAIN ,
@@ -174,11 +188,11 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
174188 zassert_equal (events [2 ].state , K_POLL_STATE_NOT_READY , "" );
175189 zassert_equal (events [3 ].state , K_POLL_STATE_NOT_READY , "" );
176190 zassert_equal (events [4 ].state , K_POLL_STATE_NOT_READY , "" );
191+ zassert_equal (events [5 ].state , K_POLL_STATE_NOT_READY , "" );
177192
178193 zassert_not_equal (k_sem_take (& no_wait_sem , K_NO_WAIT ), 0 , "" );
179194 zassert_is_null (k_fifo_get (& no_wait_fifo , K_NO_WAIT ), "" );
180- zassert_not_equal (k_msgq_get (mq , msgq_recv_buf , K_NO_WAIT ), 0 ,
181- "" );
195+ zassert_not_equal (k_msgq_get (mq , msgq_recv_buf , K_NO_WAIT ), 0 , "" );
182196}
183197
184198/* verify k_poll() that has to wait */
@@ -192,10 +206,13 @@ static struct k_poll_signal wait_signal =
192206
193207struct fifo_msg wait_msg = { NULL , FIFO_MSG_VALUE };
194208
209+ K_PIPE_DEFINE (wait_pipe , 32 , 1 );
210+
195211#define TAG_0 10
196212#define TAG_1 11
197213#define TAG_2 12
198214#define TAG_3 13
215+ #define TAG_4 14
199216
200217struct k_poll_event wait_events [] = {
201218 K_POLL_EVENT_STATIC_INITIALIZER (K_POLL_TYPE_SEM_AVAILABLE ,
@@ -213,10 +230,14 @@ struct k_poll_event wait_events[] = {
213230 K_POLL_EVENT_STATIC_INITIALIZER (K_POLL_TYPE_MSGQ_DATA_AVAILABLE ,
214231 K_POLL_MODE_NOTIFY_ONLY ,
215232 & wait_msgq , TAG_3 ),
233+ K_POLL_EVENT_STATIC_INITIALIZER (K_POLL_TYPE_PIPE_DATA_AVAILABLE ,
234+ K_POLL_MODE_NOTIFY_ONLY ,
235+ & wait_pipe , TAG_4 ),
216236};
217237
218238#define USE_FIFO (1 << 0)
219239#define USE_MSGQ (1 << 1)
240+ #define USE_PIPE (1 << 2)
220241
221242static void poll_wait_helper (void * use_queuelike , void * msgq , void * p3 )
222243{
@@ -239,6 +260,10 @@ static void poll_wait_helper(void *use_queuelike, void *msgq, void *p3)
239260
240261 k_msgq_put (msgq , & m [0 ], K_FOREVER );
241262 }
263+
264+ if (flags & USE_PIPE ) {
265+ k_pipe_write (& wait_pipe , PIPE_DATA , sizeof (PIPE_DATA ), K_NO_WAIT );
266+ }
242267}
243268
244269/* check results for multiple events */
@@ -248,6 +273,8 @@ void check_results(struct k_poll_event *events, uint32_t event_type,
248273 struct fifo_msg * msg_ptr ;
249274 char msgq_recv_buf [MSGQ_MSG_SIZE ] = {0 };
250275 char msg [] = MSGQ_MSG_VALUE ;
276+ char pipe_recv_buf [sizeof (PIPE_DATA ) + 4 ];
277+ int result ;
251278
252279 switch (event_type ) {
253280 case K_POLL_TYPE_SEM_AVAILABLE :
@@ -317,7 +344,20 @@ void check_results(struct k_poll_event *events, uint32_t event_type,
317344 "" );
318345 }
319346 break ;
320-
347+ case K_POLL_TYPE_PIPE_DATA_AVAILABLE :
348+ if (is_available ) {
349+ zassert_equal (events -> state , K_POLL_STATE_PIPE_DATA_AVAILABLE );
350+ result = k_pipe_read (& wait_pipe , pipe_recv_buf ,
351+ sizeof (pipe_recv_buf ), K_NO_WAIT );
352+ zassert_equal (result , sizeof (PIPE_DATA ));
353+ zassert_str_equal (pipe_recv_buf , PIPE_DATA );
354+ zassert_equal (events -> tag , TAG_4 );
355+ /* reset to not ready */
356+ events -> state = K_POLL_STATE_NOT_READY ;
357+ } else {
358+ zassert_equal (events -> state , K_POLL_STATE_NOT_READY );
359+ }
360+ break ;
321361 default :
322362 __ASSERT (false, "invalid event type (0x%x)\n" , event_type );
323363 break ;
@@ -403,9 +443,9 @@ ZTEST(poll_api_1cpu, test_poll_wait)
403443
404444 k_tid_t tid1 = k_thread_create (& test_thread , test_stack ,
405445 K_THREAD_STACK_SIZEOF (test_stack ),
406- poll_wait_helper , (void * )(USE_FIFO | USE_MSGQ ), wait_msgq_ptr , 0 ,
407- main_low_prio - 1 , K_USER | K_INHERIT_PERMS ,
408- K_NO_WAIT );
446+ poll_wait_helper , (void * )(USE_FIFO | USE_MSGQ | USE_PIPE ) ,
447+ wait_msgq_ptr , 0 , main_low_prio - 1 ,
448+ K_USER | K_INHERIT_PERMS , K_NO_WAIT );
409449
410450 rc = k_poll (wait_events , ARRAY_SIZE (wait_events ), K_NO_WAIT );
411451 zassert_equal (rc , - EAGAIN , "should return EAGAIN with K_NO_WAIT" );
@@ -422,6 +462,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
422462 check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , true);
423463 check_results (& wait_events [3 ], K_POLL_TYPE_IGNORE , true);
424464 check_results (& wait_events [4 ], K_POLL_TYPE_MSGQ_DATA_AVAILABLE , true);
465+ check_results (& wait_events [5 ], K_POLL_TYPE_PIPE_DATA_AVAILABLE , true);
425466
426467 /* verify events are not ready anymore */
427468 zassert_equal (k_poll (wait_events , ARRAY_SIZE (wait_events ),
@@ -433,6 +474,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
433474 check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , false);
434475 check_results (& wait_events [3 ], K_POLL_TYPE_IGNORE , false);
435476 check_results (& wait_events [4 ], K_POLL_TYPE_MSGQ_DATA_AVAILABLE , false);
477+ check_results (& wait_events [5 ], K_POLL_TYPE_PIPE_DATA_AVAILABLE , false);
436478
437479 /*
438480 * Wait for 2 out of 4 non-ready events to become ready from a higher
@@ -455,6 +497,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
455497 check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , false);
456498 check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , true);
457499 check_results (& wait_events [4 ], K_POLL_TYPE_MSGQ_DATA_AVAILABLE , false);
500+ check_results (& wait_events [4 ], K_POLL_TYPE_PIPE_DATA_AVAILABLE , false);
458501
459502 /*
460503 * Wait for each event to be ready from a lower priority thread, one at
@@ -473,6 +516,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
473516 check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , false);
474517 check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , false);
475518 check_results (& wait_events [4 ], K_POLL_TYPE_MSGQ_DATA_AVAILABLE , false);
519+ check_results (& wait_events [5 ], K_POLL_TYPE_PIPE_DATA_AVAILABLE , false);
476520
477521 /* fifo */
478522 rc = k_poll (wait_events , ARRAY_SIZE (wait_events ), K_SECONDS (1 ));
@@ -483,6 +527,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
483527 check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , true);
484528 check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , false);
485529 check_results (& wait_events [4 ], K_POLL_TYPE_MSGQ_DATA_AVAILABLE , false);
530+ check_results (& wait_events [5 ], K_POLL_TYPE_PIPE_DATA_AVAILABLE , false);
486531
487532 /* poll signal */
488533 rc = k_poll (wait_events , ARRAY_SIZE (wait_events ), K_SECONDS (1 ));
@@ -493,6 +538,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
493538 check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , false);
494539 check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , true);
495540 check_results (& wait_events [4 ], K_POLL_TYPE_MSGQ_DATA_AVAILABLE , false);
541+ check_results (& wait_events [5 ], K_POLL_TYPE_PIPE_DATA_AVAILABLE , false);
496542
497543 /* message queue */
498544 rc = k_poll (wait_events , ARRAY_SIZE (wait_events ), K_SECONDS (1 ));
@@ -503,6 +549,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
503549 check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , false);
504550 check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , false);
505551 check_results (& wait_events [4 ], K_POLL_TYPE_MSGQ_DATA_AVAILABLE , true);
552+ check_results (& wait_events [5 ], K_POLL_TYPE_PIPE_DATA_AVAILABLE , false);
506553
507554 k_thread_abort (tid1 );
508555 k_thread_abort (tid2 );
@@ -780,7 +827,8 @@ void poll_test_grant_access(void)
780827 & no_wait_signal , & wait_sem , & wait_fifo ,
781828 & cancel_fifo , & non_cancel_fifo ,
782829 & wait_signal , & test_thread , & test_signal ,
783- & test_stack , & multi_sem , & multi_reply );
830+ & test_stack , & multi_sem , & multi_reply ,
831+ & no_wait_pipe , & wait_pipe );
784832}
785833
786834
0 commit comments