| 233 | } |
| 234 | |
| 235 | void Wait(TEvents& events, TInstant deadLine) { |
| 236 | T_.clear(); |
| 237 | T_.reserve(Size()); |
| 238 | |
| 239 | for (TFds::TConstIterator it = S_.Begin(); it != S_.End(); ++it) { |
| 240 | const pollfd pfd = { |
| 241 | it->Fd, |
| 242 | PollFlags(it->Flags), |
| 243 | 0, |
| 244 | }; |
| 245 | |
| 246 | T_.push_back(pfd); |
| 247 | } |
| 248 | |
| 249 | const ssize_t ret = PollD(T_.data(), (nfds_t) T_.size(), deadLine); |
| 250 | |
| 251 | if (ret <= 0) { |
| 252 | return; |
| 253 | } |
| 254 | |
| 255 | events.reserve(T_.size()); |
| 256 | |
| 257 | for (size_t i = 0; i < T_.size(); ++i) { |
| 258 | const pollfd& pfd = T_[i]; |
| 259 | const short ev = pfd.revents; |
| 260 | |
| 261 | if (!ev) { |
| 262 | continue; |
| 263 | } |
| 264 | |
| 265 | int status = 0; |
| 266 | ui16 filter = 0; |
| 267 | |
| 268 | // We are perfectly fine with an EOF while reading a pipe or a unix socket |
| 269 | if ((ev & POLLIN) || (ev & POLLHUP) && (pfd.events & POLLIN)) { |
| 270 | filter |= CONT_POLL_READ; |
| 271 | } |
| 272 | |
| 273 | if (ev & POLLOUT) { |
| 274 | filter |= CONT_POLL_WRITE; |
| 275 | } |
| 276 | |
| 277 | #if defined(_linux_) |
| 278 | if (ev & POLLRDHUP) { |
| 279 | filter |= CONT_POLL_RDHUP; |
| 280 | } |
| 281 | #endif |
| 282 | |
| 283 | if (ev & POLLERR) { |
| 284 | status = EIO; |
| 285 | } else if (ev & POLLHUP && pfd.events & POLLOUT) { |
| 286 | // Only write operations may cause EPIPE |
| 287 | status = EPIPE; |
| 288 | } else if (ev & POLLNVAL) { |
| 289 | status = EINVAL; |
| 290 | } |
| 291 | |
| 292 | if (status) { |