Ejemplo n.º 1
0
int
evloop(void)
{
    int nev, i;
    struct timespec delay;
    while (1) {
        evtimers_run();
        delay = evtimer_delay();

        if ((nev = kevent(m_kq, NULL, 0, m_evs, 100, &delay)) < 0) {
            if (errno == EINTR)
                continue;
            else
                return -1;
        }
        memset(m_valid, 1, nev);
        for (i = 0; i < nev; i++) {
            if (m_evs[i].flags & EV_ERROR) {
                errno = m_evs[i].data;
                return -1;
            }
            struct fdev *ev = (struct fdev *)m_evs[i].udata;
            switch (m_evs[i].filter) {
            case EVFILT_READ:
                ev->rdidx = i;
                break;
            case EVFILT_WRITE:
                ev->wridx = i;
                break;
            }
        }
        for (i = 0; i < nev; i++) {
            if (!m_valid[i])
                continue;
            struct fdev *ev = (struct fdev *)m_evs[i].udata;
            switch (m_evs[i].filter) {
            case EVFILT_READ:
                if (ev->flags & EV_READ)
                    ev->cb(ev->fd, EV_READ, ev->arg);
                if (m_valid[i])
                    ev->rdidx = -1;
                break;
            case EVFILT_WRITE:
                if (ev->flags & EV_WRITE)
                    ev->cb(ev->fd, EV_WRITE, ev->arg);
                if (m_valid[i])
                    ev->wridx = -1;
                break;
            }
        }
    }
}
Ejemplo n.º 2
0
Archivo: epoll.c Proyecto: zhoubug/znet
int
evloop(void *log,int m_epfd,int *endgame)
{
    log_t *log_ = (log_t *)log;
    int nev, i, millisecs = DELAY_TIME;
//    struct timespec delay;
    struct epoll_event m_evs[100];
    while (!(*endgame)) {
        evtimers_run();
       /* delay = evtimer_delay();
        if (delay.tv_sec > 0)
            millisecs = delay.tv_sec * 1000 + delay.tv_nsec / 1000000;
        else
            millisecs = 200;//millisecs = -1;
	    */

        if ((nev = epoll_wait(m_epfd, m_evs, 100, millisecs)) < 0) {
            if (errno == EINTR)
                continue;
            else
            {
                log_error(log_,"Fatal error,evloop return,errno:%d!\n",errno);
                return -1;
            }
        }

       // memset(m_valid, 1, nev);
        for (i = 0; i < nev; i++) {
            struct fdev *ev = m_evs[i].data.ptr;
            ev->index = i;
        }
        for (i = 0; i < nev; i++) {
            struct fdev *ev = m_evs[i].data.ptr;

            if ((/*m_valid[i] &&*/
                    ev->flags & EV_READ &&
                    m_evs[i].events & (EPOLLIN|EPOLLERR|EPOLLHUP)))
                ev->cb(ev->fd, EV_READ, ev->arg);
            if ((/*m_valid[i] &&*/ ev->flags & EV_WRITE &&
                    m_evs[i].events & (EPOLLOUT|EPOLLERR|EPOLLHUP)))
                ev->cb(ev->fd, EV_WRITE, ev->arg);
            //if (m_valid[i])
            //    ev->index = -1;
        }
    }
    return 0;
}
Ejemplo n.º 3
0
int
evloop(void)
{
    int millisecs;
    struct timespec delay;
    while (1) {
        evtimers_run();

        delay = evtimer_delay();
        if (delay.tv_sec >= 0)
            millisecs = delay.tv_sec * 1000 + delay.tv_nsec / 1000000;
        else
            millisecs = -1;

        if (poll(m_pfds, m_size, millisecs) < 0) {
            if (errno == EINTR)
                continue;
            else
                return -1;
        }

        m_cur = 0;
        while (m_cur < m_size) {
            struct pollfd *pfd = &m_pfds[m_cur];
            struct poll_ev *pev = &m_pevs[m_cur];
            if ((pfd->events & POLLIN &&
                    pfd->revents & (POLLIN|POLLERR|POLLHUP)))
                pev->cb(pfd->fd, EV_READ, pev->arg);
            if ((!m_curdel && pfd->events & POLLOUT &&
                    pfd->revents & (POLLOUT|POLLERR|POLLHUP)))
                pev->cb(pfd->fd, EV_WRITE, pev->arg);
            if (!m_curdel)
                m_cur++;
            else
                m_curdel = 0;
        }
        m_cur = -1;
    }
}