void epioer::mainfunction() { g_log.log(LOG_LV_INFO,"epioer thread come!"); const int maxevsize = 4096; int ifd = 0,nfd= 0,i = 0; epoll_event evarr[maxevsize]; int itimeout = 50; while (isrun()) { int iwaitnum = (m_socknum > 0 ? std::min((int)m_socknum,maxevsize) : maxevsize); ifd = epoll_wait(m_epfd,evarr,iwaitnum,itimeout); if (ifd == -1) { if(errno == EINTR) continue; g_log.log(LOG_LV_DEBUG,"epoll_wait fail,errno %d,socknum %d.",errno,iwaitnum); return; } for (i = 0; i != ifd; ++i) { if (evarr[i].events & EPOLLERR || evarr[i].events & EPOLLHUP) { g_log.log(LOG_LV_DEBUG,"fd %d event err %d.",evarr[i].data.fd,evarr[i].events); delsock(evarr[i].data.fd); }else if (evarr[i].events & EPOLLIN) { if (!m_pep->readx(evarr[i].data.fd)) { g_log.log(LOG_LV_DEBUG,"sock %d read false.",evarr[i].data.fd); delsock(evarr[i].data.fd); } else setctl(evarr[i].data.fd,EPOLLOUT); }else if (evarr[i].events & EPOLLOUT) { if (!m_pep->writex(evarr[i].data.fd)) { g_log.log(LOG_LV_DEBUG,"sock %d write false.",evarr[i].data.fd); delsock(evarr[i].data.fd); } else setctl(evarr[i].data.fd,EPOLLIN); } } } g_log.log(LOG_LV_INFO,"epioer thread exit!"); }
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 int net_store(unsigned cpunum, void *d, u_int32_t offset, u_int32_t val) { struct net_data *nd = d; (void)cpunum; if (offset >= NET_READBUF && offset < NET_READBUF+NET_BUFSIZE) { char *ptr = &nd->nd_rbuf[offset - NET_READBUF]; *(u_int32_t *)ptr = htonl(val); return 0; } else if (offset >= NET_WRITEBUF && offset < NET_WRITEBUF+NET_BUFSIZE) { char *ptr = &nd->nd_wbuf[offset - NET_WRITEBUF]; *(u_int32_t *)ptr = htonl(val); return 0; } switch (offset) { case NETREG_READINTR: setirq(nd, val, 1); break; case NETREG_WRITEINTR: setirq(nd, val, 0); break; case NETREG_CONTROL: setctl(nd, val); break; case NETREG_STATUS: return -1; default: return -1; } return 0; }
static int ftsendlines(Serialport *p) { int res; dsprint(2, "serial: sendlines: %#2.2x\n", p->ctlstate); res = setctl(p); dsprint(2, "serial: sendlines res: %d\n", res); return 0; }
int pmcsetctl(uint32_t coreno, PmcCtl *pctl, uint32_t regno) { PmcCtr *p; Mach *mp; if(coreno == machp()->machno) return setctl(pctl, regno); mp = sys->machptr[coreno]; p = &mp->pmc[regno]; ilock(&mp->pmclock); ctl2ctl(&p->PmcCtl, pctl); p->ctlset |= PmcSet; if(shouldipi(mp)) waitnotstale(mp, p); else iunlock(&mp->pmclock); return 0; }
int pmcsetctl(u32int coreno, PmcCtl *pctl, u32int regno) { PmcCtr *p; Mach *mp; if(coreno == m->machno) return setctl(pctl, regno); mp = sys->machptr[coreno]; p = &mp->pmc[regno]; ilock(&mp->pmclock); ctl2ctl(&p->PmcCtl, pctl); p->ctlset |= PmcSet; p->stale = 1; if(mp->proc != nil || mp->nixtype != NIXAC) waitnotstale(mp, p); else iunlock(&mp->pmclock); return 0; }