| 100 | } |
| 101 | |
| 102 | int wait_for_fd(int fd, uint32_t interests, Timeout timeout) override { |
| 103 | if (unlikely(interests == 0)) { |
| 104 | errno = ENOSYS; |
| 105 | return -1; |
| 106 | } |
| 107 | auto current = CURRENT; |
| 108 | short ev = (interests == EVENT_READ) ? EVFILT_READ : EVFILT_WRITE; |
| 109 | int ret = enqueue(fd, ev, EV_ADD | EV_ONESHOT, 0, current); |
| 110 | if (ret < 0) return ret; |
| 111 | SCOPED_PAUSE_WORK_STEALING; |
| 112 | ret = thread_usleep(timeout); |
| 113 | ERRNO err; |
| 114 | if (likely(ret == -1 && err.no == EOK)) { |
| 115 | return 0; // event arrived |
| 116 | } |
| 117 | |
| 118 | enqueue(fd, ev, EV_DELETE, 0, current, true); |
| 119 | errno = (ret == 0) ? ETIMEDOUT : err.no; |
| 120 | return -1; |
| 121 | } |
| 122 | |
| 123 | ssize_t wait_and_fire_events(uint64_t timeout) override { |
| 124 | ssize_t nev = 0; |
no test coverage detected