to_wait_duration с boost asio - PullRequest
       10

to_wait_duration с boost asio

1 голос
/ 24 апреля 2019

Класс Boost Asio basic_waitable_timer (также входит в C ++ Networking TS), принимает параметр шаблона WaitTraits, который позволяет настраивать поведение с точки зрения преобразования duration и time_point значений в длительности ожидания.

В частности, класс WaitTraits должен иметь две перегрузки to_wait_duration.Ожидается, что перегрузка, которая принимает time_point, преобразует его в значение duration, которое имеет смысл для значения продолжительности ожидания, которое может быть передано функции ожидания / ожидания ОС.

Реализация по умолчанию, wait_traits<Clock>, реализовано здесь:

https://github.com/boostorg/asio/blob/develop/include/boost/asio/wait_traits.hpp

Однако, глядя на фактический исходный код реализации по умолчанию, я не могу понять, что на самом деле делает to_wait_duration,Вот код:

  static typename Clock::duration to_wait_duration(
      const typename Clock::time_point& t)
  {
    typename Clock::time_point now = Clock::now();
    if (now + (Clock::duration::max)() < t)
      return (Clock::duration::max)();
    if (now + (Clock::duration::min)() > t)
      return (Clock::duration::min)();
    return t - now;
  }

Я понял, что идея состоит в том, чтобы взять time_point и преобразовать его в значение duration, которое, вероятно, будет передано какой-либо функции ожидания ОС.Поэтому очевидный способ сделать это - просто вернуть t - Clock::now().Конечно, вы также можете захотеть сделать такие вещи, как проверка на переполнение.

Но то, что эта реализация, кажется, делает для меня не имеет смысла.Во-первых, не будет ли выражение now + Clock::duration::max() всегда вызывать целочисленное переполнение со знаком - таким образом вызывая неопределенное поведение ??(Предполагая, что Clock::duration::rep является целочисленным типом со знаком, как это было бы для стандартных chrono::duration типов).Во-вторых, я не могу сказать, чего пытается достичь эта функция.Почему он всегда возвращает Clock::duration::min(), что обычно будет отрицательным значением?

Я бы подумал, что функция to_wait_duration просто сделает что-то вроде проверки, если t > Clock::now(), а если нет, просто вернет Clock::duration::zero() (поскольку отрицательная продолжительность ожидания никогда не имеет смысла).По сути, что-то вроде:

   static typename Clock::duration to_wait_duration(const typename Clock::time_point& t)
   {
     const typename Clock::time_point now = Clock::now();
     return (t > now) ? (t - now) : Clock::duration::zero();
   }

Но ... то, что делает настоящий исходный код Boost, меня очень смущает.Что на самом деле делает реализация Boost по умолчанию wait_traits?

...