MCPcopy Create free account
hub / github.com/WasmEdge/WasmEdge / clock

Method clock

lib/host/wasi/inode-linux.cpp:1617–1675  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1615}
1616
1617void 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 }

Callers

nothing calls this directly

Calls 8

unlikelyFunction · 0.85
acquireTimerMethod · 0.80
backMethod · 0.80
setTimeMethod · 0.80
releaseTimerMethod · 0.80
eraseMethod · 0.80
fromErrNoFunction · 0.70
sizeMethod · 0.45

Tested by

no test coverage detected