mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 19:36:35 +08:00
sched/signal: Optimize code logic
Adjust the up_schedule_sigaction function to facilitate subsequent spinlock optimization work. Signed-off-by: wangzhi16 <wangzhi16@xiaomi.com>
This commit is contained in:
@@ -85,61 +85,31 @@ void up_schedule_sigaction(struct tcb_s *tcb)
|
||||
|
||||
if (tcb->task_state == TSTATE_TASK_RUNNING)
|
||||
{
|
||||
uint8_t me = this_cpu();
|
||||
#ifdef CONFIG_SMP
|
||||
uint8_t cpu = tcb->cpu;
|
||||
#else
|
||||
uint8_t cpu = 0;
|
||||
#endif
|
||||
/* Save the current register context location */
|
||||
|
||||
/* CASE 1: We are not in an interrupt handler and a task is
|
||||
* signaling itself for some reason.
|
||||
tcb->xcp.saved_regs = up_current_regs();
|
||||
|
||||
/* Duplicate the register context. These will be
|
||||
* restored by the signal trampoline after the signal has been
|
||||
* delivered.
|
||||
*/
|
||||
|
||||
if (cpu == me && !up_current_regs())
|
||||
{
|
||||
/* In this case just deliver the signal now. */
|
||||
up_current_regs() -= XCPTCONTEXT_REGS;
|
||||
memcpy(up_current_regs(), up_current_regs() +
|
||||
XCPTCONTEXT_REGS, XCPTCONTEXT_SIZE);
|
||||
|
||||
(tcb->sigdeliver)(tcb);
|
||||
tcb->sigdeliver = NULL;
|
||||
}
|
||||
up_current_regs()[REG_SP] = (uint32_t)up_current_regs();
|
||||
|
||||
/* CASE 2: The task that needs to receive the signal is running.
|
||||
* This could happen if the task is running on another CPU OR if
|
||||
* we are in an interrupt handler and the task is running on this
|
||||
* CPU. In the former case, we will have to PAUSE the other CPU
|
||||
* first. But in either case, we will have to modify the return
|
||||
* state as well as the state in the TCB.
|
||||
/* Then set up to vector to the trampoline with interrupts
|
||||
* unchanged. We must already be in privileged thread mode
|
||||
* to be here.
|
||||
*/
|
||||
|
||||
else
|
||||
{
|
||||
/* Save the current register context location */
|
||||
|
||||
tcb->xcp.saved_regs = up_current_regs();
|
||||
|
||||
/* Duplicate the register context. These will be
|
||||
* restored by the signal trampoline after the signal has been
|
||||
* delivered.
|
||||
*/
|
||||
|
||||
up_current_regs() -= XCPTCONTEXT_REGS;
|
||||
memcpy(up_current_regs(), up_current_regs() +
|
||||
XCPTCONTEXT_REGS, XCPTCONTEXT_SIZE);
|
||||
|
||||
up_current_regs()[REG_SP] = (uint32_t)up_current_regs();
|
||||
|
||||
/* Then set up to vector to the trampoline with interrupts
|
||||
* unchanged. We must already be in privileged thread mode
|
||||
* to be here.
|
||||
*/
|
||||
|
||||
up_current_regs()[REG_PC] = (uint32_t)ceva_sigdeliver;
|
||||
up_current_regs()[REG_PC] = (uint32_t)ceva_sigdeliver;
|
||||
#ifdef REG_OM
|
||||
up_current_regs()[REG_OM] &= ~REG_OM_MASK;
|
||||
up_current_regs()[REG_OM] |= REG_OM_KERNEL;
|
||||
up_current_regs()[REG_OM] &= ~REG_OM_MASK;
|
||||
up_current_regs()[REG_OM] |= REG_OM_KERNEL;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* Otherwise, we are (1) signaling a task is not running from an
|
||||
|
||||
Reference in New Issue
Block a user