14using TClock = std::chrono::steady_clock;
15using TTime = TClock::time_point;
16using THandle = std::coroutine_handle<>;
22 bool operator<(
const TTimer& e)
const {
23 return std::tuple(Deadline, Id,
static_cast<bool>(Handle)) > std::tuple(e.Deadline, e.Id,
static_cast<bool>(e.Handle));
43 bool Match(
const TEvent& other)
const {
44 return Fd == other.Fd && (Type & other.Type);
48template<
typename T1,
typename T2>
49inline std::tuple<T1, T2>
50GetDurationPair(TTime now, TTime deadline, std::chrono::milliseconds maxDuration)
53 return std::make_tuple(T1(0), T2(0));
55 auto duration = (deadline - now);
56 if (duration > maxDuration) {
57 duration = maxDuration;
59 auto part1 = std::chrono::duration_cast<T1>(duration);
61 auto part2 = std::chrono::duration_cast<T2>(duration);
63 return std::make_tuple(part1,part2);
67inline timespec GetTimespec(TTime now, TTime deadline, std::chrono::milliseconds maxDuration)
69 auto [p1, p2] = GetDurationPair<std::chrono::seconds, std::chrono::nanoseconds>(now, deadline, maxDuration);
71 ret.tv_sec = p1.count();
72 ret.tv_nsec = p2.count();