blob: 99e75028d165f13d2f43b301c678f8c708112dfb [file] [log] [blame]
#ifndef ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_
#define ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_
#include <vector>
#include <pdx/client_channel.h>
#include <pdx/file_handle.h>
#include <pdx/status.h>
namespace android {
namespace pdx {
namespace uds {
class ChannelEventSet {
public:
ChannelEventSet();
ChannelEventSet(ChannelEventSet&&) = default;
ChannelEventSet& operator=(ChannelEventSet&&) = default;
BorrowedHandle pollin_event_fd() const { return pollin_event_fd_.Borrow(); }
BorrowedHandle pollhup_event_fd() const { return pollhup_event_fd_.Borrow(); }
explicit operator bool() const {
return !!pollin_event_fd_ && !!pollhup_event_fd_;
}
int ModifyEvents(int clear_mask, int set_mask);
private:
LocalHandle pollin_event_fd_;
LocalHandle pollhup_event_fd_;
uint32_t event_bits_ = 0;
ChannelEventSet(const ChannelEventSet&) = delete;
void operator=(const ChannelEventSet&) = delete;
};
class ChannelEventReceiver {
public:
ChannelEventReceiver() = default;
ChannelEventReceiver(LocalHandle data_fd, LocalHandle pollin_event_fd,
LocalHandle pollhup_event_fd);
ChannelEventReceiver(ChannelEventReceiver&&) = default;
ChannelEventReceiver& operator=(ChannelEventReceiver&&) = default;
explicit operator bool() const {
return !!pollin_event_fd_ && !!pollhup_event_fd_ && !!data_fd_ &&
!!epoll_fd_;
}
BorrowedHandle event_fd() const { return epoll_fd_.Borrow(); }
BorrowedHandle pollin_event_fd() const { return pollin_event_fd_.Borrow(); }
BorrowedHandle pollhup_event_fd() const { return pollhup_event_fd_.Borrow(); }
BorrowedHandle data_fd() const { return data_fd_.Borrow(); }
Status<int> GetPendingEvents() const;
Status<int> PollPendingEvents(int timeout_ms) const;
std::vector<ClientChannel::EventSource> GetEventSources() const;
private:
LocalHandle data_fd_;
LocalHandle pollin_event_fd_;
LocalHandle pollhup_event_fd_;
LocalHandle epoll_fd_;
ChannelEventReceiver(const ChannelEventReceiver&) = delete;
void operator=(const ChannelEventReceiver&) = delete;
};
} // namespace uds
} // namespace pdx
} // namespace android
#endif // ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_