void pmcupdate(Mach *m) { PmcCtr *p; int i, maxct, wk; PmcWait *w; return; maxct = pmcnregs(); for (i = 0; i < maxct; i++) { p = &m->pmc[i]; ilock(&m->pmclock); if(p->ctrset & PmcSet) setctr(p->ctr, i); if(p->ctlset & PmcSet) setctl(&p->PmcCtl, i); p->ctr = getctr(i); getctl(&p->PmcCtl, i); p->ctrset = PmcIgn; p->ctlset = PmcIgn; wk = p->stale; p->stale = 0; if(wk){ for(w = p->wq; w != nil; w = w->next){ p->wq = w->next; wakeup(&w->rend); pmcwclose(w); } } iunlock(&m->pmclock); } }
static void waitnotstale(Mach *mp, PmcCtr *p) { PmcWait *w; w = newpmcw(); w->next = p->wq; p->wq = w; incref(w); iunlock(&mp->pmclock); apicipi(mp->apicno); if(waserror()){ pmcwclose(w); nexterror(); } sleep(&w->r, notstale, p); poperror(); pmcwclose(w); }