Changeset 367

Show
Ignore:
Timestamp:
06/06/07 23:45:10 (2 years ago)
Author:
blackhedd
Message:

initial support for epoll

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • version_0/ext/ed.cpp

    r337 r367  
    7676                throw std::runtime_error ("bad eventable descriptor"); 
    7777        CreatedAt = gCurrentLoopTime; 
     78 
     79        #ifdef HAVE_EPOLL 
     80        EpollEvent.data.ptr = this; 
     81        #endif 
    7882} 
    7983 
     
    152156******************************************/ 
    153157 
    154 ConnectionDescriptor::ConnectionDescriptor (int sd): 
     158ConnectionDescriptor::ConnectionDescriptor (EventMachine_t *em, int sd): 
    155159        EventableDescriptor (sd), 
    156160        bConnectPending (false), 
     
    162166        bIsServer (false), 
    163167        LastIo (gCurrentLoopTime), 
    164         InactivityTimeout (0) 
    165 
     168        InactivityTimeout (0), 
     169        MyEventMachine (em) 
     170
     171        #ifdef HAVE_EPOLL 
     172        EpollEvent.events = EPOLLOUT; 
     173        #endif 
    166174} 
    167175 
     
    275283        OutboundPages.push_back (OutboundPage (buffer, length)); 
    276284        OutboundDataSize += length; 
     285        #ifdef HAVE_EPOLL 
     286        EpollEvent.events = (EPOLLIN | EPOLLOUT); 
     287        assert (MyEventMachine); 
     288        MyEventMachine->_ModifyEpollEvent (this); 
     289        #endif 
    277290        return length; 
    278291} 
     
    480493                                (*EventCallback)(GetBinding().c_str(), EM_CONNECTION_COMPLETED, "", 0); 
    481494                        bConnectPending = false; 
     495                        #ifdef HAVE_EPOLL 
     496                        // The callback may have scheduled outbound data. 
     497                        EpollEvent.events = EPOLLIN | (SelectForWrite() ? EPOLLOUT : 0); 
     498                        #endif 
    482499                } 
    483500                else 
     
    546563                        OutboundPages.push_front (OutboundPage (buffer, len)); 
    547564                } 
     565 
     566                #ifdef HAVE_EPOLL 
     567                EpollEvent.events = (EPOLLIN | (SelectForWrite() ? EPOLLOUT : 0)); 
     568                assert (MyEventMachine); 
     569                MyEventMachine->_ModifyEpollEvent (this); 
     570                #endif 
    548571        } 
    549572        else { 
     
    673696 
    674697AcceptorDescriptor::AcceptorDescriptor (EventMachine_t *parent_em, int sd): 
    675   EventableDescriptor (sd), 
    676   MyEventMachine (parent_em) 
    677 
    678   /* This is really bad and ugly. Change someday if possible. 
    679    * We have to know about an event-machine (probably the one that owns us), 
    680    * so we can pass newly-created connections to it. 
    681    */ 
    682  
    683   if (!MyEventMachine) 
    684     throw std::runtime_error ("bad event-machine passed to acceptor"); 
     698        EventableDescriptor (sd), 
     699        MyEventMachine (parent_em) 
     700
     701        /* This is really bad and ugly. Change someday if possible. 
     702         * We have to know about an event-machine (probably the one that owns us), 
     703         * so we can pass newly-created connections to it. 
     704         */ 
     705 
     706        if (!MyEventMachine) 
     707                throw std::runtime_error ("bad event-machine passed to acceptor"); 
     708 
     709        #ifdef HAVE_EPOLL 
     710        EpollEvent.events = EPOLLIN; 
     711        #endif 
    685712} 
    686713 
     
    745772 
    746773 
    747                 ConnectionDescriptor *cd = new ConnectionDescriptor (sd); 
     774                ConnectionDescriptor *cd = new ConnectionDescriptor (MyEventMachine, sd); 
    748775                if (!cd) 
    749776                        throw std::runtime_error ("no newly accepted connection"); 
     
    752779                        (*EventCallback) (GetBinding().c_str(), EM_CONNECTION_ACCEPTED, cd->GetBinding().c_str(), cd->GetBinding().size()); 
    753780                } 
     781                #ifdef HAVE_EPOLL 
     782                cd->GetEpollEvent()->events = EPOLLIN | (cd->SelectForWrite() ? EPOLLOUT : 0); 
     783                #endif 
    754784                assert (MyEventMachine); 
    755785                MyEventMachine->Add (cd);