void Epoll::DispatchEvent() { int fds = epoll_wait(epfd_, evts_, size_, 1000); if (fds == -1){ if (errno == EINTR) return; throw Exception("Epoll epoll_wait failed, "); } for (int i = 0; i < fds; ++i) { EventHandler* handler = reinterpret_cast<EventHandler*>(evts_[i].data.ptr); if (evts_[i].events & EventHandler::READ_MASK) { if (handler->Receive() == -1) handler->Close(); } if (evts_[i].events & EventHandler::WRITE_MASK) { if (handler->Send() == -1){ Trace("TRACE SENDSENDSENDSENDSENDSENDSENDSENSEND"); handler->Close(); } } } //timer: gettimeofday gettimeofday(&now_, NULL); if(now_.tv_sec - before_.tv_sec >= INTERVAL){ TimeQ::iterator iter = TimerQueue::timeq().begin(); for(; iter != TimerQueue::timeq().end(); ){ EventHandler* handler = iter->first; //Note("TimeQueue: sum=%d, handler=%p", TimerQueue::timeq().size(), handler); iter->second = iter->second - INTERVAL; if(0 == (iter->second % HEARTBEAT)){ //heartbeat if(NULL != handler){ handler->Send(); } } bool flag = false; TimeQ::iterator it = iter; it++; if(iter->second - INTERVAL < 0){ if(NULL != handler){ handler->Timeout(flag); } iter->second = TimerQueue::threshold(); } iter = it; } gettimeofday(&before_, NULL); } }
/*========================================================= * @public =========================================================*/ int FightRequestService::Process(boost::shared_ptr<C2S_FightRequest> _item UNUSED, EventHandler* _handler){ Note("FightRequest : roleid=%s, froleid=%s", _item->roleid().c_str(), _item->froleid().c_str()); //int roleid = StringTool::Str2Int(_item->roleid()); //int froleid = StringTool::Str2Int(_item->froleid()); boost::shared_ptr<S2C_FightRequest> response(new S2C_FightRequest()); EventHandler* buddy = Registry::QueryHandler(_item->froleid()); if(NULL == buddy){ Error("Can't Find Buddy!"); //+++++++++++++++++++++++++++++++++++++ //Add NoT Found Status, and send back //+++++++++++++++++++++++++++++++++++++ return -1; } response->set_roleid(_item->roleid()); response->set_froleid(_item->froleid()); char* buf = new char[response->ByteSize()]; *buf = 0; //Send Head head; head.type = FIGHTREQUEST; head.version = 1; *buf = 0; head.length = response->ByteSize(); response->SerializeToArray(buf, head.length); if(ESTABLISHED == _handler->Connected()){ _handler->Send(head, buf, head.length); } if(ESTABLISHED == Registry::QueryHandler(_item->froleid())->Connected()){ buddy->Send(head, buf, head.length); } delete buf; return 1; }