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 #ifndef MUDUO_NET_POLLER_H
9 #define MUDUO_NET_POLLER_H
10 
11 #include <map>
12 #include <vector>
13 
14 #include "datetime/Timestamp.h"
15 #include "EventLoop.h"
16 
17 struct pollfd;
18 
19 namespace muduo
20 {
21 
22 class Channel;
23 
24 ///
25 /// IO Multiplexing with poll(2).
26 ///
27 /// This class doesn't own the Channel objects.
28 class Poller : boost::noncopyable
29 {
30  public:
31   typedef std::vector<Channel*> ChannelList;
32 
33   Poller(EventLoop* loop);
34   ~Poller();
35 
36   /// Polls the I/O events.
37   /// Must be called in the loop thread.
38   Timestamp poll(int timeoutMs, ChannelList* activeChannels);
39 
40   /// Changes the interested I/O events.
41   /// Must be called in the loop thread.
42   void updateChannel(Channel* channel);
43+  /// Remove the channel, when it destructs.
44+  /// Must be called in the loop thread.
45+  void removeChannel(Channel* channel);
46 
47   void assertInLoopThread() { ownerLoop_->assertInLoopThread(); }
48 
49  private:
50   void fillActiveChannels(int numEvents,
51                           ChannelList* activeChannels) const;
52 
53   typedef std::vector<struct pollfd> PollFdList;
54   typedef std::map<int, Channel*> ChannelMap;
55 
56   EventLoop* ownerLoop_;
57   PollFdList pollfds_;
58   ChannelMap channels_;
59 };
60 
61 }
62 #endif  // MUDUO_NET_POLLER_H
63