1 #ifndef ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_
2 #define ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_
3 
4 #include <vector>
5 
6 #include <pdx/client_channel.h>
7 #include <pdx/file_handle.h>
8 #include <pdx/status.h>
9 
10 namespace android {
11 namespace pdx {
12 namespace uds {
13 
14 class ChannelEventSet {
15  public:
16   ChannelEventSet();
17   ChannelEventSet(ChannelEventSet&&) = default;
18   ChannelEventSet& operator=(ChannelEventSet&&) = default;
19 
pollin_event_fd()20   BorrowedHandle pollin_event_fd() const { return pollin_event_fd_.Borrow(); }
pollhup_event_fd()21   BorrowedHandle pollhup_event_fd() const { return pollhup_event_fd_.Borrow(); }
22 
23   explicit operator bool() const {
24     return !!pollin_event_fd_ && !!pollhup_event_fd_;
25   }
26 
27   int ModifyEvents(int clear_mask, int set_mask);
28 
29  private:
30   LocalHandle pollin_event_fd_;
31   LocalHandle pollhup_event_fd_;
32   uint32_t event_bits_ = 0;
33 
34   ChannelEventSet(const ChannelEventSet&) = delete;
35   void operator=(const ChannelEventSet&) = delete;
36 };
37 
38 class ChannelEventReceiver {
39  public:
40   ChannelEventReceiver() = default;
41   ChannelEventReceiver(LocalHandle data_fd, LocalHandle pollin_event_fd,
42                        LocalHandle pollhup_event_fd);
43   ChannelEventReceiver(ChannelEventReceiver&&) = default;
44   ChannelEventReceiver& operator=(ChannelEventReceiver&&) = default;
45 
46   explicit operator bool() const {
47     return !!pollin_event_fd_ && !!pollhup_event_fd_ && !!data_fd_ &&
48            !!epoll_fd_;
49   }
50 
event_fd()51   BorrowedHandle event_fd() const { return epoll_fd_.Borrow(); }
52 
pollin_event_fd()53   BorrowedHandle pollin_event_fd() const { return pollin_event_fd_.Borrow(); }
pollhup_event_fd()54   BorrowedHandle pollhup_event_fd() const { return pollhup_event_fd_.Borrow(); }
data_fd()55   BorrowedHandle data_fd() const { return data_fd_.Borrow(); }
56 
57   // Moves file descriptors out of ChannelEventReceiver. Note these operations
58   // immediately invalidates the receiver.
TakeFds()59   std::tuple<LocalHandle, LocalHandle, LocalHandle> TakeFds() {
60     epoll_fd_.Close();
61     return {std::move(data_fd_), std::move(pollin_event_fd_),
62             std::move(pollhup_event_fd_)};
63   }
64 
65   Status<int> GetPendingEvents() const;
66   Status<int> PollPendingEvents(int timeout_ms) const;
67 
68   std::vector<ClientChannel::EventSource> GetEventSources() const;
69 
70  private:
71   LocalHandle data_fd_;
72   LocalHandle pollin_event_fd_;
73   LocalHandle pollhup_event_fd_;
74   LocalHandle epoll_fd_;
75 
76   ChannelEventReceiver(const ChannelEventReceiver&) = delete;
77   void operator=(const ChannelEventReceiver&) = delete;
78 };
79 
80 }  // namespace uds
81 }  // namespace pdx
82 }  // namespace android
83 
84 #endif  // ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_
85