muduo的TCPserver端初始化步骤,以EchoServer_unittest.cc为例

环境变量里加export MUDUO_LOG_TRACE=1使其打印出最多的日志

看这个库需要boost基础,这个专栏地址参考价值比较大

 EchoServer_unittest.cc代码如下

EventLoop loop;
  InetAddress listenAddr(2000, false, ipv6);
  EchoServer server(&loop, listenAddr);

  server.start();

  loop.loop();

1、EventLoop构造如下

EventLoop::EventLoop()
  : looping_(false),
    quit_(false),
    eventHandling_(false),
    callingPendingFunctors_(false),
    iteration_(0),
    threadId_(CurrentThread::tid()),
    poller_(Poller::newDefaultPoller(this)),
    timerQueue_(new TimerQueue(this)),
    wakeupFd_(createEventfd()),
    wakeupChannel_(new Channel(this, wakeupFd_)),
    currentActiveChannel_(NULL)
{
  LOG_DEBUG << "EventLoop created " << this << " in thread " << threadId_;
  LOG_TRACE << "wakeupFd_ = " << wakeupFd_ << " in thread " << threadId_;


以上这里poller_(Poller::newDefaultPoller(this)),new了个epoll对象代码如下

EPollPoller::EPollPoller(EventLoop* loop)
  : Poller(loop),
    epollfd_(::epoll_create1(EPOLL_CLOEXEC)),
    events_(kInitEventListSize)

使用新API接口:epoll_create1创建了个epollfd_


接着在epollfd_下挂了关注三个fd

timerQueue_(new TimerQueue(this)),这里创建了个timerfd,并弄成了Channel

wakeupFd_(createEventfd()),
    wakeupChannel_(new Channel(this, wakeupFd_)),

wakeupFd_  notify里用的 唤醒 EventLoop 的 是baseloop?待后面研究


EchoServer server(&loop, listenAddr);这句构造函数如下


TcpServer::TcpServer(EventLoop* loop,
                     const InetAddress& listenAddr,
                     const string& nameArg,
                     Option option)
  : loop_(CHECK_NOTNULL(loop)),
    ipPort_(listenAddr.toIpPort()),
    name_(nameArg),
    acceptor_(new Acceptor(loop, listenAddr, option == kReusePort)),
    threadPool_(new EventLoopThreadPool(loop, name_)),
    connectionCallback_(defaultConnectionCallback),
    messageCallback_(defaultMessageCallback),
    nextConnId_(1)

创建了Acceptor 和 EventLoopThreadPool

Acceptor::Acceptor(EventLoop* loop, const InetAddress& listenAddr, bool reuseport)
  : loop_(loop),
    acceptSocket_(sockets::createNonblockingOrDie(listenAddr.family())),
    acceptChannel_(loop, acceptSocket_.fd()),
    listenning_(false),
    idleFd_(::open("/dev/null", O_RDONLY | O_CLOEXEC))
{
  assert(idleFd_ >= 0);
  LOG_TRACE << "acceptSocket_.fd = " << acceptSocket_.fd();

Acceptor这里就创建了acceptSocket_.fd

loop_是base pool  threadPool_是根据setThreadNum设置才有的


接着 server.start();代码如下启动监听

void TcpServer::start()
{
  if (started_.getAndSet(1) == 0)
  {
    threadPool_->start(threadInitCallback_);

    assert(!acceptor_->listenning());
    loop_->runInLoop(
        boost::bind(&Acceptor::listen, get_pointer(acceptor_)));
  }
}

Acceptor::listen里有acceptChannel_.enableReading();这句 ,类似Channel的enable系列里面都有 update 就最终在EPollPoller.cc文件里

TRACE updateChannel fd = 6 events = 3 index = -1 - EPollPoller.cc:113
20170830 12:39:39.678981Z  5875 TRACE update epoll_ctl op = ADD fd = 6 event = { 6: IN PRI  } - EPollPoller.cc:181

实现效果了

接着 void EventLoop::loop()就 pollReturnTime_ = poller_->poll(kPollTimeMs, &activeChannels_); poll在这个地方了

日志如下


[root@localhost bin]# ./echoserver_unittest
20170830 12:39:39.675537Z  5875 INFO  pid = 5875, tid = 5875 - EchoServer_unittest.cc:73
20170830 12:39:39.675809Z  5875 INFO  sizeof TcpConnection = 236 - EchoServer_unittest.cc:74
20170830 12:39:39.675863Z  5875 TRACE EPollPoller epollfd_ = 3 - EPollPoller.cc:45
20170830 12:39:39.675891Z  5875 TRACE Channel fd_ = 4 - Channel.cc:35
20170830 12:39:39.675904Z  5875 TRACE Channel loop_ = 0xBFD1F1E0 - Channel.cc:36
20170830 12:39:39.675910Z  5875 TRACE TimerQueue timerfd_ = 4 - TimerQueue.cc:102
20170830 12:39:39.675918Z  5875 TRACE updateChannel fd = 4 events = 3 index = -1 - EPollPoller.cc:113
20170830 12:39:39.676131Z  5875 TRACE update epoll_ctl op = ADD fd = 4 event = { 4: IN PRI  } - EPollPoller.cc:181
20170830 12:39:39.676167Z  5875 TRACE Channel fd_ = 5 - Channel.cc:35
20170830 12:39:39.676174Z  5875 TRACE Channel loop_ = 0xBFD1F1E0 - Channel.cc:36
20170830 12:39:39.676181Z  5875 DEBUG EventLoop EventLoop created 0xBFD1F1E0 in thread 5875 - EventLoop.cc:76
20170830 12:39:39.676192Z  5875 TRACE EventLoop wakeupFd_ = 5 in thread 5875 - EventLoop.cc:77
20170830 12:39:39.676205Z  5875 TRACE updateChannel fd = 5 events = 3 index = -1 - EPollPoller.cc:113
20170830 12:39:39.676219Z  5875 TRACE update epoll_ctl op = ADD fd = 5 event = { 5: IN PRI  } - EPollPoller.cc:181
20170830 12:39:39.676279Z  5875 TRACE Channel fd_ = 6 - Channel.cc:35
20170830 12:39:39.676287Z  5875 TRACE Channel loop_ = 0xBFD1F1E0 - Channel.cc:36
20170830 12:39:39.678890Z  5875 TRACE Acceptor acceptSocket_.fd = 6 - Acceptor.cc:34
20170830 12:39:39.678955Z  5875 TRACE updateChannel fd = 6 events = 3 index = -1 - EPollPoller.cc:113
20170830 12:39:39.678981Z  5875 TRACE update epoll_ctl op = ADD fd = 6 event = { 6: IN PRI  } - EPollPoller.cc:181
20170830 12:39:39.678993Z  5875 TRACE loop EventLoop 0xBFD1F1E0 start looping - EventLoop.cc:109
20170830 12:39:39.678999Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59
20170830 12:39:49.679514Z  5875 TRACE poll nothing happended - EPollPoller.cc:77
20170830 12:39:49.679567Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59
20170830 12:39:59.694012Z  5875 TRACE poll nothing happended - EPollPoller.cc:77
20170830 12:39:59.694126Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59
20170830 12:40:09.709135Z  5875 TRACE poll nothing happended - EPollPoller.cc:77
20170830 12:40:09.709186Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59
20170830 12:40:19.713299Z  5875 TRACE poll nothing happended - EPollPoller.cc:77
20170830 12:40:19.713349Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59




你可能感兴趣的:(开源软件解读之muduo库)