static inline void asgn_min_prio(int cpuid) { // find minimum priority in timers_struct RT_TASK *timer_manager; struct rt_tasklet_struct *timer, *timerl; spinlock_t *lock; unsigned long flags; int priority; priority = (timer = (timerl = &timers_list[LIST_CPUID])->next)->priority; flags = rt_spin_lock_irqsave(lock = &timers_lock[LIST_CPUID]); while ((timer = timer->next) != timerl) { if (timer->priority < priority) { priority = timer->priority; } rt_spin_unlock_irqrestore(flags, lock); flags = rt_spin_lock_irqsave(lock); } rt_spin_unlock_irqrestore(flags, lock); flags = rt_global_save_flags_and_cli(); if ((timer_manager = &timers_manager[LIST_CPUID])->priority > priority) { timer_manager->priority = priority; if (timer_manager->state == RT_SCHED_READY) { rem_ready_task(timer_manager); enq_ready_task(timer_manager); } } rt_global_restore_flags(flags); }
static inline void rt_exec_signal(RT_TASK *sigtask, RT_TASK *task) { unsigned long flags; flags = rt_global_save_flags_and_cli(); if (sigtask->suspdepth > 0 && !(--sigtask->suspdepth)) { if (task) { sigtask->priority = task->priority; if (!task->pstate++) { rem_ready_task(task); task->state |= RT_SCHED_SIGSUSP; } } sigtask->state &= ~RT_SCHED_SIGSUSP; sigtask->retval = (long)task; enq_ready_task(sigtask); RT_SCHEDULE(sigtask, rtai_cpuid()); } rt_global_restore_flags(flags); }