queue: k_queue_cancel_wait: Fix not interrupting other threads
When k_poll is being used k_queue_cancel_wait shall mark the state as K_POLL_STATE_NOT_READY so other threads will get properly notified with a NULL pointer return. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
fc775a095c
commit
48fadfe623
1 changed files with 4 additions and 6 deletions
|
@ -68,11 +68,9 @@ static void prepare_thread_to_run(struct k_thread *thread, void *data)
|
|||
#endif /* CONFIG_POLL */
|
||||
|
||||
/* returns 1 if a reschedule must take place, 0 otherwise */
|
||||
static inline int handle_poll_events(struct k_queue *queue)
|
||||
static inline int handle_poll_events(struct k_queue *queue, u32_t state)
|
||||
{
|
||||
#ifdef CONFIG_POLL
|
||||
u32_t state = K_POLL_STATE_DATA_AVAILABLE;
|
||||
|
||||
return _handle_obj_poll_events(&queue->poll_events, state);
|
||||
#else
|
||||
return 0;
|
||||
|
@ -95,7 +93,7 @@ void k_queue_cancel_wait(struct k_queue *queue)
|
|||
}
|
||||
}
|
||||
#else
|
||||
if (handle_poll_events(queue)) {
|
||||
if (handle_poll_events(queue, K_POLL_STATE_NOT_READY)) {
|
||||
(void)_Swap(key);
|
||||
return;
|
||||
}
|
||||
|
@ -126,7 +124,7 @@ void k_queue_insert(struct k_queue *queue, void *prev, void *data)
|
|||
sys_slist_insert(&queue->data_q, prev, data);
|
||||
|
||||
#if defined(CONFIG_POLL)
|
||||
if (handle_poll_events(queue)) {
|
||||
if (handle_poll_events(queue, K_POLL_STATE_DATA_AVAILABLE)) {
|
||||
(void)_Swap(key);
|
||||
return;
|
||||
}
|
||||
|
@ -171,7 +169,7 @@ void k_queue_append_list(struct k_queue *queue, void *head, void *tail)
|
|||
}
|
||||
#else
|
||||
sys_slist_append_list(&queue->data_q, head, tail);
|
||||
if (handle_poll_events(queue)) {
|
||||
if (handle_poll_events(queue, K_POLL_STATE_DATA_AVAILABLE)) {
|
||||
(void)_Swap(key);
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue