| 1615 | } |
| 1616 | |
| 1617 | void Poller::clock(__wasi_clockid_t Clock, __wasi_timestamp_t Timeout, |
| 1618 | __wasi_timestamp_t Precision, __wasi_subclockflags_t Flags, |
| 1619 | __wasi_userdata_t UserData) noexcept { |
| 1620 | assuming(Events.size() < WasiEvents.size()); |
| 1621 | auto &Event = Events.emplace_back(); |
| 1622 | Event.Valid = false; |
| 1623 | Event.userdata = UserData; |
| 1624 | Event.type = __WASI_EVENTTYPE_CLOCK; |
| 1625 | |
| 1626 | if (auto Res = Ctx->acquireTimer(Clock); unlikely(!Res)) { |
| 1627 | Event.Valid = true; |
| 1628 | Event.error = Res.error(); |
| 1629 | return; |
| 1630 | } else { |
| 1631 | Timers.emplace_back(std::move(*Res)); |
| 1632 | } |
| 1633 | |
| 1634 | auto &Timer = Timers.back(); |
| 1635 | if (auto Res = Timer.setTime(Timeout, Precision, Flags); unlikely(!Res)) { |
| 1636 | Ctx->releaseTimer(std::move(Timer)); |
| 1637 | Timers.pop_back(); |
| 1638 | Event.Valid = true; |
| 1639 | Event.error = Res.error(); |
| 1640 | return; |
| 1641 | } |
| 1642 | |
| 1643 | assuming(Timer.Fd != Fd); |
| 1644 | try { |
| 1645 | auto [Iter, Added] = FdDatas.try_emplace(Timer.Fd); |
| 1646 | |
| 1647 | Iter->second.ReadEvent = &Event; |
| 1648 | assuming(Added); |
| 1649 | |
| 1650 | epoll_event EPollEvent; |
| 1651 | EPollEvent.events = EPOLLIN; |
| 1652 | #if defined(EPOLLRDHUP) |
| 1653 | EPollEvent.events |= EPOLLRDHUP; |
| 1654 | #endif |
| 1655 | EPollEvent.data.fd = Timer.Fd; |
| 1656 | |
| 1657 | if (auto Res = ::epoll_ctl(Fd, EPOLL_CTL_ADD, Timer.Fd, &EPollEvent); |
| 1658 | unlikely(Res < 0)) { |
| 1659 | FdDatas.erase(Iter); |
| 1660 | Ctx->releaseTimer(std::move(Timer)); |
| 1661 | Timers.pop_back(); |
| 1662 | Event.Valid = true; |
| 1663 | Event.error = fromErrNo(errno); |
| 1664 | return; |
| 1665 | } |
| 1666 | |
| 1667 | return; |
| 1668 | } catch (std::bad_alloc &) { |
| 1669 | Ctx->releaseTimer(std::move(Timer)); |
| 1670 | Timers.pop_back(); |
| 1671 | Event.Valid = true; |
| 1672 | Event.error = __WASI_ERRNO_NOMEM; |
| 1673 | return; |
| 1674 | } |
nothing calls this directly
no test coverage detected