1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef LIBS_VR_LIBDVRCOMMON_INCLUDE_PRIVATE_DVR_EPOLL_FILE_DESCRIPTOR_H_ 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define LIBS_VR_LIBDVRCOMMON_INCLUDE_PRIVATE_DVR_EPOLL_FILE_DESCRIPTOR_H_ 3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <android-base/unique_fd.h> 54fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko#include <log/log.h> 6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <sys/epoll.h> 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android { 9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr { 10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass EpollFileDescriptor { 12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public: 13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static const int CTL_ADD = EPOLL_CTL_ADD; 14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static const int CTL_MOD = EPOLL_CTL_MOD; 15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static const int CTL_DEL = EPOLL_CTL_DEL; 16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EpollFileDescriptor() : fd_(-1) {} 18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Constructs an EpollFileDescriptor from an integer file descriptor and 20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // takes ownership. 21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko explicit EpollFileDescriptor(int fd) : fd_(fd) {} 22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko bool IsValid() const { return fd_.get() >= 0; } 24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Create() { 26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (IsValid()) { 274fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko ALOGW("epoll fd has already been created."); 28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -EALREADY; 29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko fd_.reset(epoll_create(64)); 32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (fd_.get() < 0) 34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -errno; 35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko else 36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Control(int op, int target_fd, epoll_event* ev) { 40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (epoll_ctl(fd_.get(), op, target_fd, ev) < 0) 41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -errno; 42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko else 43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Wait(epoll_event* events, int maxevents, int timeout) { 47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int ret = epoll_wait(fd_.get(), events, maxevents, timeout); 48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) 50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -errno; 51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko else 52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ret; 53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 558a4e6a90e6b7edf73fa0d79dd5b439f8e52eb9f0Corey Tabaka int Get() const { return fd_.get(); } 568a4e6a90e6b7edf73fa0d79dd5b439f8e52eb9f0Corey Tabaka 57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private: 58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko base::unique_fd fd_; 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}; 60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace dvr 62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace android 63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif // LIBS_VR_LIBDVRCOMMON_INCLUDE_PRIVATE_DVR_EPOLL_FILE_DESCRIPTOR_H_ 65