@@ -18,12 +18,14 @@ struct fifo_msg {
18
18
#define MSGQ_MSG_SIZE 4
19
19
#define MSGQ_MAX_MSGS 16
20
20
#define MSGQ_MSG_VALUE {'a', 'b', 'c', 'd'}
21
+ #define PIPE_DATA "atad_epip"
21
22
#define STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
22
23
23
24
/* verify k_poll() without waiting */
24
25
static struct k_sem no_wait_sem ;
25
26
static struct k_fifo no_wait_fifo ;
26
27
static struct k_poll_signal no_wait_signal ;
28
+ K_PIPE_DEFINE (no_wait_pipe , 32 , 1 );
27
29
static struct k_poll_signal test_signal ;
28
30
#ifndef CONFIG_USERSPACE
29
31
static struct k_msgq no_wait_msgq ;
@@ -63,6 +65,7 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
63
65
unsigned int signaled ;
64
66
char msgq_recv_buf [MSGQ_MSG_SIZE ] = {0 };
65
67
char msgq_msg [MSGQ_MSG_SIZE ] = MSGQ_MSG_VALUE ;
68
+ char pipe_recv_buf [sizeof (PIPE_DATA ) + 4 ];
66
69
int result ;
67
70
struct k_msgq * mq ;
68
71
#ifdef CONFIG_USERSPACE
@@ -78,6 +81,8 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
78
81
79
82
k_msgq_alloc_init (mq , MSGQ_MSG_SIZE , MSGQ_MAX_MSGS );
80
83
84
+ k_pipe_write (& no_wait_pipe , PIPE_DATA , sizeof (PIPE_DATA ), K_NO_WAIT );
85
+
81
86
struct k_poll_event events [] = {
82
87
K_POLL_EVENT_INITIALIZER (K_POLL_TYPE_SEM_AVAILABLE ,
83
88
K_POLL_MODE_NOTIFY_ONLY ,
@@ -94,6 +99,9 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
94
99
K_POLL_EVENT_INITIALIZER (K_POLL_TYPE_MSGQ_DATA_AVAILABLE ,
95
100
K_POLL_MODE_NOTIFY_ONLY ,
96
101
mq ),
102
+ K_POLL_EVENT_INITIALIZER (K_POLL_TYPE_PIPE_DATA_AVAILABLE ,
103
+ K_POLL_MODE_NOTIFY_ONLY ,
104
+ & no_wait_pipe ),
97
105
};
98
106
99
107
#ifdef CONFIG_USERSPACE
@@ -159,12 +167,18 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
159
167
zassert_false (k_msgq_get (mq , msgq_recv_buf , K_NO_WAIT ));
160
168
zassert_false (memcmp (msgq_msg , msgq_recv_buf , MSGQ_MSG_SIZE ), "" );
161
169
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
+
162
175
/* verify events are not ready anymore (user has to clear them first) */
163
176
events [0 ].state = K_POLL_STATE_NOT_READY ;
164
177
events [1 ].state = K_POLL_STATE_NOT_READY ;
165
178
events [2 ].state = K_POLL_STATE_NOT_READY ;
166
179
events [3 ].state = K_POLL_STATE_NOT_READY ;
167
180
events [4 ].state = K_POLL_STATE_NOT_READY ;
181
+ events [5 ].state = K_POLL_STATE_NOT_READY ;
168
182
k_poll_signal_reset (& no_wait_signal );
169
183
170
184
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)
174
188
zassert_equal (events [2 ].state , K_POLL_STATE_NOT_READY , "" );
175
189
zassert_equal (events [3 ].state , K_POLL_STATE_NOT_READY , "" );
176
190
zassert_equal (events [4 ].state , K_POLL_STATE_NOT_READY , "" );
191
+ zassert_equal (events [5 ].state , K_POLL_STATE_NOT_READY , "" );
177
192
178
193
zassert_not_equal (k_sem_take (& no_wait_sem , K_NO_WAIT ), 0 , "" );
179
194
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 , "" );
182
196
}
183
197
184
198
/* verify k_poll() that has to wait */
@@ -192,10 +206,13 @@ static struct k_poll_signal wait_signal =
192
206
193
207
struct fifo_msg wait_msg = { NULL , FIFO_MSG_VALUE };
194
208
209
+ K_PIPE_DEFINE (wait_pipe , 32 , 1 );
210
+
195
211
#define TAG_0 10
196
212
#define TAG_1 11
197
213
#define TAG_2 12
198
214
#define TAG_3 13
215
+ #define TAG_4 14
199
216
200
217
struct k_poll_event wait_events [] = {
201
218
K_POLL_EVENT_STATIC_INITIALIZER (K_POLL_TYPE_SEM_AVAILABLE ,
@@ -213,10 +230,14 @@ struct k_poll_event wait_events[] = {
213
230
K_POLL_EVENT_STATIC_INITIALIZER (K_POLL_TYPE_MSGQ_DATA_AVAILABLE ,
214
231
K_POLL_MODE_NOTIFY_ONLY ,
215
232
& 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 ),
216
236
};
217
237
218
238
#define USE_FIFO (1 << 0)
219
239
#define USE_MSGQ (1 << 1)
240
+ #define USE_PIPE (1 << 2)
220
241
221
242
static void poll_wait_helper (void * use_queuelike , void * msgq , void * p3 )
222
243
{
@@ -239,6 +260,10 @@ static void poll_wait_helper(void *use_queuelike, void *msgq, void *p3)
239
260
240
261
k_msgq_put (msgq , & m [0 ], K_FOREVER );
241
262
}
263
+
264
+ if (flags & USE_PIPE ) {
265
+ k_pipe_write (& wait_pipe , PIPE_DATA , sizeof (PIPE_DATA ), K_NO_WAIT );
266
+ }
242
267
}
243
268
244
269
/* check results for multiple events */
@@ -248,6 +273,8 @@ void check_results(struct k_poll_event *events, uint32_t event_type,
248
273
struct fifo_msg * msg_ptr ;
249
274
char msgq_recv_buf [MSGQ_MSG_SIZE ] = {0 };
250
275
char msg [] = MSGQ_MSG_VALUE ;
276
+ char pipe_recv_buf [sizeof (PIPE_DATA ) + 4 ];
277
+ int result ;
251
278
252
279
switch (event_type ) {
253
280
case K_POLL_TYPE_SEM_AVAILABLE :
@@ -317,7 +344,20 @@ void check_results(struct k_poll_event *events, uint32_t event_type,
317
344
"" );
318
345
}
319
346
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 ;
321
361
default :
322
362
__ASSERT (false, "invalid event type (0x%x)\n" , event_type );
323
363
break ;
@@ -403,9 +443,9 @@ ZTEST(poll_api_1cpu, test_poll_wait)
403
443
404
444
k_tid_t tid1 = k_thread_create (& test_thread , test_stack ,
405
445
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 );
409
449
410
450
rc = k_poll (wait_events , ARRAY_SIZE (wait_events ), K_NO_WAIT );
411
451
zassert_equal (rc , - EAGAIN , "should return EAGAIN with K_NO_WAIT" );
@@ -422,6 +462,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
422
462
check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , true);
423
463
check_results (& wait_events [3 ], K_POLL_TYPE_IGNORE , true);
424
464
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);
425
466
426
467
/* verify events are not ready anymore */
427
468
zassert_equal (k_poll (wait_events , ARRAY_SIZE (wait_events ),
@@ -433,6 +474,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
433
474
check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , false);
434
475
check_results (& wait_events [3 ], K_POLL_TYPE_IGNORE , false);
435
476
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);
436
478
437
479
/*
438
480
* 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)
455
497
check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , false);
456
498
check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , true);
457
499
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);
458
501
459
502
/*
460
503
* 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)
473
516
check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , false);
474
517
check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , false);
475
518
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);
476
520
477
521
/* fifo */
478
522
rc = k_poll (wait_events , ARRAY_SIZE (wait_events ), K_SECONDS (1 ));
@@ -483,6 +527,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
483
527
check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , true);
484
528
check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , false);
485
529
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);
486
531
487
532
/* poll signal */
488
533
rc = k_poll (wait_events , ARRAY_SIZE (wait_events ), K_SECONDS (1 ));
@@ -493,6 +538,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
493
538
check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , false);
494
539
check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , true);
495
540
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);
496
542
497
543
/* message queue */
498
544
rc = k_poll (wait_events , ARRAY_SIZE (wait_events ), K_SECONDS (1 ));
@@ -503,6 +549,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
503
549
check_results (& wait_events [1 ], K_POLL_TYPE_DATA_AVAILABLE , false);
504
550
check_results (& wait_events [2 ], K_POLL_TYPE_SIGNAL , false);
505
551
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);
506
553
507
554
k_thread_abort (tid1 );
508
555
k_thread_abort (tid2 );
@@ -780,7 +827,8 @@ void poll_test_grant_access(void)
780
827
& no_wait_signal , & wait_sem , & wait_fifo ,
781
828
& cancel_fifo , & non_cancel_fifo ,
782
829
& 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 );
784
832
}
785
833
786
834
0 commit comments