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 "Channel.h"
9 #include "EventLoop.h"
10 #include "logging/Logging.h"
11 
12 #include <sstream>
13 
14 #include <poll.h>
15 
16 using namespace muduo;
17 
18 const int Channel::kNoneEvent = 0;
19 const int Channel::kReadEvent = POLLIN | POLLPRI;
20 const int Channel::kWriteEvent = POLLOUT;
21 
22 Channel::Channel(EventLoop* loop, int fdArg)
23   : loop_(loop),
24     fd_(fdArg),
25     events_(0),
26     revents_(0),
27     index_(-1),
28     eventHandling_(false)
29 {
30 }
31 
32 Channel::~Channel()
33 {
34   assert(!eventHandling_);
35 }
36 
37 void Channel::update()
38 {
39   loop_->updateChannel(this);
40 }
41 
42!void Channel::handleEvent(Timestamp receiveTime)
43 {
44   eventHandling_ = true;
45   if (revents_ & POLLNVAL) {
46     LOG_WARN << "Channel::handle_event() POLLNVAL";
47   }
48 
49   if ((revents_ & POLLHUP) && !(revents_ & POLLIN)) {
50     LOG_WARN << "Channel::handle_event() POLLHUP";
51     if (closeCallback_) closeCallback_();
52   }
53   if (revents_ & (POLLERR | POLLNVAL)) {
54     if (errorCallback_) errorCallback_();
55   }
56   if (revents_ & (POLLIN | POLLPRI | POLLRDHUP)) {
57!    if (readCallback_) readCallback_(receiveTime);
58   }
59   if (revents_ & POLLOUT) {
60     if (writeCallback_) writeCallback_();
61   }
62   eventHandling_ = false;
63 }
64