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