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