diff --git a/td/telegram/Client.cpp b/td/telegram/Client.cpp index 274cd9a65..9c760947a 100644 --- a/td/telegram/Client.cpp +++ b/td/telegram/Client.cpp @@ -225,16 +225,9 @@ class Client::Impl final { ~Impl() { input_queue_->writer_put({0, nullptr}); scheduler_thread_.join(); -#if !TD_WINDOWS - auto &event_fd = output_queue_->reader_get_event_fd(); - poll_.unsubscribe(event_fd.get_poll_info().get_pollable_fd_ref()); -#endif } private: -#if !TD_WINDOWS - Poll poll_; -#endif std::shared_ptr input_queue_; std::shared_ptr output_queue_; std::shared_ptr scheduler_; @@ -257,12 +250,6 @@ class Client::Impl final { } scheduler->finish(); }); - -#if !TD_WINDOWS - poll_.init(); - auto &event_fd = output_queue_->reader_get_event_fd(); - poll_.subscribe(event_fd.get_poll_info().extract_pollable_fd(nullptr), PollFlags::Read()); -#endif } Response receive_unlocked(double timeout) { @@ -274,11 +261,7 @@ class Client::Impl final { return output_queue_->reader_get_unsafe(); } if (timeout != 0) { -#if TD_WINDOWS output_queue_->reader_get_event_fd().wait(static_cast(timeout * 1000)); -#else - poll_.run(static_cast(timeout * 1000)); -#endif return receive_unlocked(0); } return {0, nullptr}; diff --git a/tdutils/td/utils/port/EventFdBase.h b/tdutils/td/utils/port/EventFdBase.h index d6ff2ab9c..59165b29b 100644 --- a/tdutils/td/utils/port/EventFdBase.h +++ b/tdutils/td/utils/port/EventFdBase.h @@ -27,5 +27,6 @@ class EventFdBase { virtual Status get_pending_error() TD_WARN_UNUSED_RESULT = 0; virtual void release() = 0; virtual void acquire() = 0; + virtual void wait(int timeout_ms) = 0; }; } // namespace td diff --git a/tdutils/td/utils/port/detail/EventFdBsd.cpp b/tdutils/td/utils/port/detail/EventFdBsd.cpp index 0d9f7e5e7..1d969e7ff 100644 --- a/tdutils/td/utils/port/detail/EventFdBsd.cpp +++ b/tdutils/td/utils/port/detail/EventFdBsd.cpp @@ -19,6 +19,7 @@ char disable_linker_warning_about_empty_file_event_fd_bsd_cpp TD_UNUSED; #include #include #include +#include namespace td { namespace detail { @@ -88,6 +89,13 @@ void EventFdBsd::acquire() { } } +void EventFdBsd::wait(int timeout_ms) { + pollfd fd; + fd.fd = get_poll_info().native_fd().fd(); + fd.events = POLLIN; + poll(&fd, 1, timeout_ms); +} + } // namespace detail } // namespace td diff --git a/tdutils/td/utils/port/detail/EventFdBsd.h b/tdutils/td/utils/port/detail/EventFdBsd.h index 2f511dfb8..caab0d322 100644 --- a/tdutils/td/utils/port/detail/EventFdBsd.h +++ b/tdutils/td/utils/port/detail/EventFdBsd.h @@ -39,6 +39,8 @@ class EventFdBsd final : public EventFdBase { void release() override; void acquire() override; + + void wait(int timeout_ms) override; }; } // namespace detail diff --git a/tdutils/td/utils/port/detail/EventFdLinux.cpp b/tdutils/td/utils/port/detail/EventFdLinux.cpp index a7271934a..574395879 100644 --- a/tdutils/td/utils/port/detail/EventFdLinux.cpp +++ b/tdutils/td/utils/port/detail/EventFdLinux.cpp @@ -18,6 +18,7 @@ char disable_linker_warning_about_empty_file_event_fd_linux_cpp TD_UNUSED; #include #include +#include namespace td { namespace detail { @@ -106,6 +107,13 @@ void EventFdLinux::acquire() { } } +void EventFdLinux::wait(int timeout_ms) { + pollfd fd; + fd.fd = get_poll_info().native_fd().fd(); + fd.events = POLLIN; + poll(&fd, 1, timeout_ms); +} + } // namespace detail } // namespace td diff --git a/tdutils/td/utils/port/detail/EventFdLinux.h b/tdutils/td/utils/port/detail/EventFdLinux.h index 933922c9c..096d5b61f 100644 --- a/tdutils/td/utils/port/detail/EventFdLinux.h +++ b/tdutils/td/utils/port/detail/EventFdLinux.h @@ -41,6 +41,8 @@ class EventFdLinux final : public EventFdBase { void release() override; void acquire() override; + + void wait(int timeout_ms) override; }; } // namespace detail diff --git a/tdutils/td/utils/port/detail/EventFdWindows.h b/tdutils/td/utils/port/detail/EventFdWindows.h index 085c30346..6a2515da8 100644 --- a/tdutils/td/utils/port/detail/EventFdWindows.h +++ b/tdutils/td/utils/port/detail/EventFdWindows.h @@ -39,7 +39,7 @@ class EventFdWindows final : public EventFdBase { void acquire() override; - void wait(int timeout_ms); + void wait(int timeout_ms) override; }; } // namespace detail diff --git a/tdutils/td/utils/queue.h b/tdutils/td/utils/queue.h index 309b71045..6561a458f 100644 --- a/tdutils/td/utils/queue.h +++ b/tdutils/td/utils/queue.h @@ -400,10 +400,7 @@ class PollQueue : public QueueT { while ((res = reader_wait_nonblock()) == 0) { // TODO: reader_flush? - pollfd fd; - fd.fd = reader_get_event_fd().get_poll_info().native_fd().fd(); - fd.events = POLLIN; - poll(&fd, 1, -1); + reader_get_event_fd().wait(1000); } return res; }