set_current_executing(thread);
switch_context();
+
fail("unexpected return from switching");
}
cpu_enable_interrupt();
}
-int
+bool
can_schedule(struct thread* thread)
{
if (!thread) {
return 0;
}
+ if (proc_terminated(thread)) {
+ return false;
+ }
+
+ if (preempt_check_stalled(thread)) {
+ thread_flags_set(thread, TH_STALLED);
+ return true;
+ }
+
if (unlikely(kernel_process(thread->process))) {
// a kernel process is always runnable
return thread->state == PS_READY;
if ((thread->state & PS_PAUSED)) {
return !!(sh->sig_pending & ~1);
}
+
if ((thread->state & PS_BLOCKED)) {
return sigset_test(sh->sig_pending, _SIGINT);
}
// all other threads are also SIGSTOP (as per POSIX-2008.1)
// In which case, the entire process is stopped.
thread->state = PS_STOPPED;
- return 0;
+ return false;
}
+
if (sigset_test(sh->sig_pending, _SIGCONT)) {
thread->state = PS_READY;
}
assert(sched_ctx.ptable_len && sched_ctx.ttable_len);
// 上下文切换相当的敏感!我们不希望任何的中断打乱栈的顺序……
- cpu_disable_interrupt();
+ no_preemption();
if (!(current_thread->state & ~PS_RUNNING)) {
current_thread->state = PS_READY;
fail("unexpected return from scheduler");
}
-void
-sched_pass()
-{
- cpu_enable_interrupt();
- cpu_trap_sched();
-}
-
__DEFINE_LXSYSCALL1(unsigned int, sleep, unsigned int, seconds)
{
if (!seconds) {
}
wpid = wpid ? wpid : -__current->pgid;
+
repeat:
llist_for_each(proc, n, &__current->children, siblings)
{
return 0;
}
// 放弃当前的运行机会
- sched_pass();
+ yield_current();
goto repeat;
done:
if (status) {
- *status = proc->exit_code | status_flags;
+ *status = PEXITNUM(status_flags, proc->exit_code);
}
return destroy_process(proc->pid);
}