Ejemplo n.º 1
0
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!");
}
Ejemplo n.º 2
0
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);
	}
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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;
}
Ejemplo n.º 6
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;
}