int setpri(int pri) { int p; /* called by up so not on run queue */ p = up->pri; up->pri = pri; if(up->state == Running && anyhigher()) sched(); return p; }
int preemption(int tick) { if(up != nil && up->state == Running && !up->preempted && (anyhigher() || tick && anyready())){ up->preempted = 1; sched(); splhi(); up->preempted = 0; return 1; } return 0; }
/* * here once per clock tick to see if we should resched */ void hzsched(void) { /* once a second, rebalance will reprioritize ready procs */ if(m->machno == 0) rebalance(); /* unless preempted, get to run for at least 100ms */ if(anyhigher() || (!up->fixedpri && m->ticks > m->schedticks && anyready())){ m->readied = nil; /* avoid cooperative scheduling */ up->delaysched++; } }
static void genrandom(void*) { setpri(PriBackground); for(;;) { for(;;) if(++rb.randomcount > 100000) break; if(anyhigher()) sched(); if(rb.filled || !rbnotfull(0)) sleep(&rb.producer, rbnotfull, 0); } }
static void genrandom(void*) { up->basepri = PriNormal; up->priority = up->basepri; for(;;){ for(;;) if(++rb.randomcount > 100000) break; if(anyhigher()) sched(); if(!rbnotfull(0)) sleep(&rb.producer, rbnotfull, 0); } }
/* * here at the end of non-clock interrupts to see if we should preempt the * current process. Returns 1 if preempted, 0 otherwise. */ int preempted(void) { if(up != nil && up->state == Running) if(up->preempted == 0) if(anyhigher()) if(!active.exiting){ m->readied = nil; /* avoid cooperative scheduling */ up->preempted = 1; sched(); splhi(); up->preempted = 0; return 1; } return 0; }
int preempted(void) { Mach *m = machp(); if(m->externup && m->externup->state == Running) if(m->externup->preempted == 0) if(anyhigher()) if(!active.exiting){ m->readied = nil; /* avoid cooperative scheduling */ m->externup->preempted = 1; sched(); splhi(); m->externup->preempted = 0; return 1; } return 0; }
/* * here at the end of non-clock interrupts to see if we should preempt the * current process. Returns 1 if preempted, 0 otherwise. */ int preempted(void) { if(up && up->state == Running) if(up->preempted == 0) if(anyhigher()) if(!active.exiting){ /* Core 0 is dispatching all interrupts, so no core * actually running a user process is ever going call preempted, unless * we consider IPIs for preemption or we distribute interrupts. * But we are going to use SMP for machines with few cores. panic("preemted used"); */ up->preempted = 1; sched(); splhi(); up->preempted = 0; return 1; } return 0; }