1 // excerpts from http://code.google.com/p/muduo/ 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the License file. 5 // 6 // Author: Shuo Chen (chenshuo at chenshuo dot com) 7 8 #include "EventLoop.h" 9 10+#include "Channel.h" 11+#include "Poller.h" 12+ 13 #include "logging/Logging.h" 14 15 #include <assert.h> 16 17 using namespace muduo; 18 19 __thread EventLoop* t_loopInThisThread = 0; 20+const int kPollTimeMs = 10000; 21 22 EventLoop::EventLoop() 23 : looping_(false), 24+ quit_(false), 25 threadId_(CurrentThread::tid()), 26+ poller_(new Poller(this)) 27 { 28 LOG_TRACE << "EventLoop created " << this << " in thread " << threadId_; 29 if (t_loopInThisThread) 30 { 31 LOG_FATAL << "Another EventLoop " << t_loopInThisThread 32 << " exists in this thread " << threadId_; 33 } 34 else 35 { 36 t_loopInThisThread = this; 37 } 38 } 39 40 EventLoop::~EventLoop() 41 { 42 assert(!looping_); 43 t_loopInThisThread = NULL; 44 } 45 46 void EventLoop::loop() 47 { 48 assert(!looping_); 49 assertInLoopThread(); 50 looping_ = true; 51+ quit_ = false; 52 53+ while (!quit_) 54+ { 55+ activeChannels_.clear(); 56+ poller_->poll(kPollTimeMs, &activeChannels_); 57+ for (ChannelList::iterator it = activeChannels_.begin(); 58+ it != activeChannels_.end(); ++it) 59+ { 60+ (*it)->handleEvent(); 61+ } 62+ } 63 64 LOG_TRACE << "EventLoop " << this << " stop looping"; 65 looping_ = false; 66 } 67 68+void EventLoop::quit() 69+{ 70+ quit_ = true; 71+ // wakeup(); 72+} 73+ 74+void EventLoop::updateChannel(Channel* channel) 75+{ 76+ assert(channel->ownerLoop() == this); 77+ assertInLoopThread(); 78+ poller_->updateChannel(channel); 79+} 80+ 81 void EventLoop::abortNotInLoopThread() 82 { 83 LOG_FATAL << "EventLoop::abortNotInLoopThread - EventLoop " << this 84 << " was created in threadId_ = " << threadId_ 85 << ", current thread id = " << CurrentThread::tid(); 86 } 87 88