From 4db9cfbebe6d66f31d3a851fde82fd20318bfd05 Mon Sep 17 00:00:00 2001 From: thewon86 Date: Mon, 24 Jan 2022 16:52:26 +0800 Subject: [PATCH] return thread error when resumed by signal --- components/drivers/ipc/waitqueue.c | 7 ++++++- src/ipc.c | 9 +-------- src/thread.c | 11 +++++++++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/components/drivers/ipc/waitqueue.c b/components/drivers/ipc/waitqueue.c index 4c6bb7e97f..6a26604617 100644 --- a/components/drivers/ipc/waitqueue.c +++ b/components/drivers/ipc/waitqueue.c @@ -7,6 +7,7 @@ * Date Author Notes * 2018/06/26 Bernard Fix the wait queue issue when wakeup a soon * to blocked thread. + * 2022-01-24 THEWON let rt_wqueue_wait return thread->error when using signal */ #include @@ -141,6 +142,10 @@ int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int msec) rt_list_init(&__wait.list); level = rt_hw_interrupt_disable(); + + /* reset thread error */ + tid->error = RT_EOK; + if (queue->flag == RT_WQ_FLAG_WAKEUP) { /* already wakeup */ @@ -171,5 +176,5 @@ __exit_wakeup: rt_wqueue_remove(&__wait); - return 0; + return tid->error; } diff --git a/src/ipc.c b/src/ipc.c index aea149a67a..5d4a2d018f 100755 --- a/src/ipc.c +++ b/src/ipc.c @@ -40,6 +40,7 @@ * 2021-01-03 Meco Man implement rt_mb_urgent() * 2021-05-30 Meco Man implement rt_mutex_trytake() * 2022-01-07 Gabriel Moving __on_rt_xxxxx_hook to ipc.c + * 2022-01-24 THEWON let rt_mutex_take return thread->error when using signal */ #include @@ -947,9 +948,6 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time) } else { -#ifdef RT_USING_SIGNALS -__again: -#endif /* RT_USING_SIGNALS */ /* The value of mutex is 1 in initial status. Therefore, if the * value is great than 0, it indicates the mutex is avaible. */ @@ -1026,11 +1024,6 @@ __again: if (thread->error != RT_EOK) { -#ifdef RT_USING_SIGNALS - /* interrupt by signal, try it again */ - if (thread->error == -RT_EINTR) goto __again; -#endif /* RT_USING_SIGNALS */ - /* return error */ return thread->error; } diff --git a/src/thread.c b/src/thread.c index bf1f2482a9..30208f1dd1 100644 --- a/src/thread.c +++ b/src/thread.c @@ -30,6 +30,7 @@ * 2021-11-15 THEWON Remove duplicate work between idle and _thread_exit * 2021-12-27 Meco Man remove .init_priority * 2022-01-07 Gabriel Moving __on_rt_xxxxx_hook to thread.c + * 2022-01-24 THEWON let rt_thread_sleep return thread->error when using signal */ #include @@ -566,6 +567,9 @@ rt_err_t rt_thread_sleep(rt_tick_t tick) /* disable interrupt */ temp = rt_hw_interrupt_disable(); + /* reset thread error */ + thread->error = RT_EOK; + /* suspend thread */ rt_thread_suspend(thread); @@ -582,7 +586,7 @@ rt_err_t rt_thread_sleep(rt_tick_t tick) if (thread->error == -RT_ETIMEOUT) thread->error = RT_EOK; - return RT_EOK; + return thread->error; } /** @@ -625,6 +629,9 @@ rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick) /* disable interrupt */ level = rt_hw_interrupt_disable(); + /* reset thread error */ + thread->error = RT_EOK; + cur_tick = rt_tick_get(); if (cur_tick - *tick < inc_tick) { @@ -657,7 +664,7 @@ rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick) rt_hw_interrupt_enable(level); } - return RT_EOK; + return thread->error; } RTM_EXPORT(rt_thread_delay_until);