| 2192 | } |
| 2193 | |
| 2194 | void Poller::clock(__wasi_clockid_t Clock, __wasi_timestamp_t Timeout, |
| 2195 | __wasi_timestamp_t Precision, __wasi_subclockflags_t Flags, |
| 2196 | __wasi_userdata_t UserData) noexcept { |
| 2197 | assuming(Events.size() < WasiEvents.size()); |
| 2198 | auto &Event = Events.emplace_back(); |
| 2199 | Event.Valid = false; |
| 2200 | Event.userdata = UserData; |
| 2201 | Event.type = __WASI_EVENTTYPE_CLOCK; |
| 2202 | |
| 2203 | if (Flags & __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME) { |
| 2204 | __wasi_timestamp_t Now; |
| 2205 | if (auto Res = Clock::clockTimeGet(Clock, Precision, Now); unlikely(!Res)) { |
| 2206 | Event.Valid = true; |
| 2207 | Event.error = Res.error(); |
| 2208 | return; |
| 2209 | } |
| 2210 | if (Timeout < Now) { |
| 2211 | // already expired |
| 2212 | Event.Valid = true; |
| 2213 | Event.error = __WASI_ERRNO_SUCCESS; |
| 2214 | return; |
| 2215 | } |
| 2216 | Timeout -= Now; |
| 2217 | } |
| 2218 | const auto Micros = std::chrono::duration_cast<std::chrono::microseconds>( |
| 2219 | std::chrono::nanoseconds(Timeout)); |
| 2220 | const auto Secs = std::chrono::duration_cast<std::chrono::seconds>(Micros); |
| 2221 | |
| 2222 | TIMEVAL_ SysTimeout; |
| 2223 | SysTimeout.tv_sec = static_cast<long>(Secs.count()); |
| 2224 | SysTimeout.tv_usec = |
| 2225 | static_cast<long>(std::chrono::microseconds(Micros - Secs).count()); |
| 2226 | |
| 2227 | if (TimeoutEvent == nullptr || MinimumTimeout.tv_sec > SysTimeout.tv_sec || |
| 2228 | (MinimumTimeout.tv_sec == SysTimeout.tv_sec && |
| 2229 | MinimumTimeout.tv_usec > SysTimeout.tv_usec)) { |
| 2230 | TimeoutEvent = &Event; |
| 2231 | MinimumTimeout = SysTimeout; |
| 2232 | } |
| 2233 | } |
| 2234 | |
| 2235 | void Poller::close(const INode &) noexcept {} |
| 2236 | |