Exemplo n.º 1
0
int Request::forward(int serverId)
{

	EventReactor *reactor = conn_->getReactor();
	Connector *connector = reactor->getConnector(serverId);
	if(connector == NULL)
	{
		return NOT_MATCH_SERVER;	
	}

	Event *evt = new Event();
	evt->set_event(SEND_BACKEND_EVENT);
	evt->setHandler(connector);
	evt->arg = this;
	reactor->registerEvent(evt);
	return 0;	
}
Exemplo n.º 2
0
int DevPoller::waitAndProcessEvents(int iTimeoutMilliSec)
{
    if (m_curChanges)
        if (applyChanges() == -1)
            return LS_FAIL;
    struct dvpoll dvp;
    dvp.dp_fds     = m_events;
    dvp.dp_nfds    = MAX_EVENTS;
    dvp.dp_timeout = iTimeoutMilliSec;
    int ret = ioctl(m_fdDP, DP_POLL, &dvp);
    if (ret > 0)
    {
        struct pollfd *pBegin = m_events;
        struct pollfd *pEnd   = &m_events[ret];
        for (; pBegin < pEnd; ++pBegin)
        {
            int fd = pBegin->fd;
            //LS_DBG_L( "DevPoller: fd: %d, revents: %hd", fd, pBegin->revents );
            if (fd > m_reactorIndex.getCapacity())
            {
                //LS_DBG_L( "DevPoller: overflow, remove fd: %d", fd );
                appendChange(fd, POLLREMOVE);
            }
            else
            {
                EventReactor *pReactor = m_reactorIndex.get(fd);
                //if ( !pReactor )
                //    LS_DBG_L( "DevPoller: pReactor is NULL, remove fd: %d", fd );
                if ((pReactor) && (pBegin->fd == pReactor->getfd()))
                {
                    pReactor->setRevent(pBegin->revents);
                    pReactor->handleEvents(pBegin->revents);
                }
                else
                {
                    //LS_DBG_L( "DevPoller: does not match, remove fd: %d", fd );
                    appendChange(fd, POLLREMOVE);
                }
            }
        }
    }
    return ret;

}
Exemplo n.º 3
0
int epoll::reinit()
{
    struct epoll_event epevt;
    close( m_epfd );
    m_epfd = (syscall(__NR_epoll_create, m_reactorIndex.getCapacity() ));
    if ( m_epfd == -1 )
        return -1;
    epevt.data.u64 = 0;
    ::fcntl( m_epfd, F_SETFD, FD_CLOEXEC );
    int n = m_reactorIndex.getUsed();
    for( int i = 0; i < n; ++i )
    {
        EventReactor * pHandler = m_reactorIndex.get( i );
        if ( pHandler )
        {
            epevt.data.u64 = 0;
            epevt.data.fd = pHandler->getfd();
            epevt.events = pHandler->getEvents();
            //(syscall(__NR_epoll_ctl, m_epfd, EPOLL_CTL_ADD, epevt.data.fd, &epevt));
            epoll_ctl( m_epfd, EPOLL_CTL_ADD, epevt.data.fd, &epevt);
        }
    }
    return 0;
}
Exemplo n.º 4
0
int epoll::waitAndProcessEvents( int iTimeoutMilliSec )
{
    //int ret = (syscall(__NR_epoll_wait, m_epfd, m_pResults, EPOLL_RESULT_MAX, iTimeoutMilliSec ));
    int ret = epoll_wait( m_epfd, m_pResults, EPOLL_RESULT_MAX, iTimeoutMilliSec );
    if ( ret <= 0 )
        return ret;
    if ( ret == 1 )
    {
        int fd = m_pResults->data.fd;
        EventReactor * pReactor = m_reactorIndex.get( fd );
        if ( pReactor && (pReactor->getfd() == fd ) )
        {
            if ( m_pResults->events & POLLHUP )
                pReactor->incHupCounter();
            pReactor->assignRevent( m_pResults->events );
            pReactor->handleEvents( m_pResults->events );
        }
        return 1;
    }
    //if ( ret > EPOLL_RESULT_MAX )
    //    ret = EPOLL_RESULT_MAX;
    int    problem_detected = 0;
    struct epoll_event * pEnd= m_pResults + ret;
    struct epoll_event * p = m_pResults;
    while( p < pEnd )
    {
        int fd = p->data.fd;
        EventReactor * pReactor = m_reactorIndex.get( fd );
        assert( p->events );
        if ( pReactor )
        {
            if ( pReactor->getfd() == fd )
            {
                pReactor->assignRevent( p->events );
            }
            else
            {
                p->data.fd = -1;
            }
        }
        else
        {
            //p->data.fd = -1;
            if (( s_loop_fd == -1 )||( s_loop_fd == fd ))
            {
                if ( s_loop_fd == -1 )
                {
                    s_loop_fd = fd;
                    s_loop_count = 0;
                }
                problem_detected = 1;
                ++s_loop_count;
                if ( s_loop_count == 10 )
                {
                    if ( p->events & (POLLHUP|POLLERR) )
                        close( fd );
                    else
                    {
                        struct epoll_event epevt;
                        memset( &epevt, 0, sizeof( struct epoll_event ) );
                        epevt.data.u64 = 0;
                        epevt.data.fd = fd;
                        epevt.events = 0;
                        (syscall(__NR_epoll_ctl, m_epfd, EPOLL_CTL_DEL, fd, &epevt ));
                        //LOG_WARN(( "[%d] Remove looping fd: %d, event: %d\n", getpid(), fd, p->events ));
                        ++s_problems;
                    }
                }
                else if ( s_loop_count >= 20 )
                {
                    //LOG_WARN(( "Looping fd: %d, event: %d\n", fd, p->events ));
                    assert( p->events );
                    problem_detected = 0;
                }
            }
        }
        ++p;
    }
    p = m_pResults;
    while( p < pEnd )
    {
        int fd = p->data.fd;
        if ( fd != -1 )
        {
            EventReactor * pReactor = m_reactorIndex.get( fd );
            if ( pReactor && (pReactor->getAssignedRevent() == (int)p->events ) )
            {
                if ( p->events & POLLHUP )
                    pReactor->incHupCounter();
                pReactor->handleEvents( p->events );
            }
        }
        ++p;
    }

    if ( !problem_detected && s_loop_count )
    {
        s_loop_fd = -1;
        s_loop_count = 0;
    }
    memset( m_pResults, 0, sizeof( struct epoll_event) * ret );
    return ret;
    
}