Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions include/rtdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,11 @@ typedef struct rt_timer *rt_timer_t;
typedef unsigned long rt_sigset_t;
typedef siginfo_t rt_siginfo_t;
typedef void (*rt_sighandler_t)(int signo);
#ifdef RT_USING_MUSLLIBC
#define RT_SIG_MASK(signo) ((rt_sigset_t)1 << ((signo) - 1))
#else
#define RT_SIG_MASK(signo) ((rt_sigset_t)1 << (signo))
#endif
#endif /* RT_USING_SIGNALS */
/**@}*/

Expand Down
28 changes: 27 additions & 1 deletion src/scheduler_mp.c
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,30 @@ static rt_thread_t _prepare_context_switch_locked(int cpu_id,
}

#ifdef RT_USING_SIGNALS
/* Check whether a signal may wake the thread in its suspend state. */
static rt_bool_t _sched_signal_wakeup_allowed(struct rt_thread *thread)
{
rt_uint8_t stat;
rt_sigset_t pending;

stat = RT_SCHED_CTX(thread).stat;
pending = thread->sig_pending & thread->sig_mask;

if (stat & RT_THREAD_STAT_SIGNAL_WAIT)
{
return RT_TRUE;
}

if (!(stat & RT_SIGNAL_COMMON_WAKEUP_MASK))
{
return RT_TRUE;
}

return !(stat & RT_SIGNAL_KILL_WAKEUP_MASK) &&
(pending & (RT_SIG_MASK(SIGKILL) |
RT_SIG_MASK(SIGSTOP)));
}

/**
* @brief Preprocess pending signals for a suspended thread
*
Expand All @@ -727,7 +751,9 @@ static void _sched_thread_preprocess_signal(struct rt_thread *current_thread)
if (rt_sched_thread_is_suspended(current_thread))
{
/* if current_thread signal is in pending */
if ((RT_SCHED_CTX(current_thread).stat & RT_THREAD_STAT_SIGNAL_MASK) & RT_THREAD_STAT_SIGNAL_PENDING)
if (((RT_SCHED_CTX(current_thread).stat & RT_THREAD_STAT_SIGNAL_MASK) &
RT_THREAD_STAT_SIGNAL_PENDING) &&
_sched_signal_wakeup_allowed(current_thread))
{
#ifdef RT_USING_SMART
rt_thread_wakeup(current_thread);
Expand Down
Loading
Loading