/* * Always splhi()'ed. */ void schedinit(void) /* never returns */ { Edf *e; machp()->inidle = 1; machp()->proc = nil; ainc(&run.nmach); setlabel(&machp()->sched); Proc *up = externup(); if(infected_with_std()){ print("mach %d got an std from %s (pid %d)!\n", machp()->machno, up ? up->text : "*notext", up ? up->pid : -1 ); disinfect_std(); } if(up) { if((e = up->edf) && (e->flags & Admitted)) edfrecord(up); machp()->qstart = 0; machp()->qexpired = 0; coherence(); machp()->proc = 0; switch(up->state) { case Running: ready(up); break; case Moribund: up->state = Dead; stopac(); edfstop(up); if (up->edf) free(up->edf); up->edf = nil; /* * Holding locks from pexit: * procalloc * pga */ mmurelease(up); unlock(&pga.l); psrelease(up); unlock(&procalloc.l); break; } up->mach = nil; updatecpu(up); machp()->externup = nil; } sched(); }
/* * Always splhi()'ed. */ void schedinit(void) /* never returns */ { Mach *m = machp(); Edf *e; m->inidle = 1; m->proc = nil; ainc(&run.nmach); setlabel(&m->sched); if(m->externup) { if((e = m->externup->edf) && (e->flags & Admitted)) edfrecord(m->externup); m->qstart = 0; m->qexpired = 0; coherence(); m->proc = 0; switch(m->externup->state) { case Running: ready(m->externup); break; case Moribund: m->externup->state = Dead; stopac(); edfstop(m->externup); if (m->externup->edf) free(m->externup->edf); m->externup->edf = nil; /* * Holding locks from pexit: * procalloc * pga */ mmurelease(m->externup); unlock(&pga); psrelease(m->externup); unlock(&procalloc); break; } m->externup->mach = nil; updatecpu(m->externup); m->externup = nil; } sched(); }
/* * Always splhi()'ed. */ void schedinit(void) /* never returns */ { Edf *e; setlabel(&m->sched); if(up != nil) { if((e = up->edf) != nil && (e->flags & Admitted)) edfrecord(up); m->proc = nil; switch(up->state) { case Running: ready(up); break; case Moribund: up->state = Dead; edfstop(up); if(up->edf != nil) free(up->edf); up->edf = nil; /* * Holding locks from pexit: * procalloc * palloc */ mmurelease(up); unlock(&palloc); up->mach = nil; updatecpu(up); up->qnext = procalloc.free; procalloc.free = up; /* proc is free now, make sure unlock() wont touch it */ up = procalloc.Lock.p = nil; unlock(&procalloc); sched(); } up->mach = nil; updatecpu(up); up = nil; } sched(); }