EventFd: wait
GitOrigin-RevId: 1ae5d1c3d1316a7c5a868c4246b406182915b399
This commit is contained in:
parent
9225edd757
commit
02e83aad78
@ -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<InputQueue> input_queue_;
|
||||
std::shared_ptr<OutputQueue> output_queue_;
|
||||
std::shared_ptr<ConcurrentScheduler> 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<int>(timeout * 1000));
|
||||
#else
|
||||
poll_.run(static_cast<int>(timeout * 1000));
|
||||
#endif
|
||||
return receive_unlocked(0);
|
||||
}
|
||||
return {0, nullptr};
|
||||
|
@ -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
|
||||
|
@ -19,6 +19,7 @@ char disable_linker_warning_about_empty_file_event_fd_bsd_cpp TD_UNUSED;
|
||||
#include <fcntl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <poll.h>
|
||||
|
||||
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
|
||||
|
||||
|
@ -39,6 +39,8 @@ class EventFdBsd final : public EventFdBase {
|
||||
void release() override;
|
||||
|
||||
void acquire() override;
|
||||
|
||||
void wait(int timeout_ms) override;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
@ -18,6 +18,7 @@ char disable_linker_warning_about_empty_file_event_fd_linux_cpp TD_UNUSED;
|
||||
|
||||
#include <sys/eventfd.h>
|
||||
#include <unistd.h>
|
||||
#include <poll.h>
|
||||
|
||||
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
|
||||
|
||||
|
@ -41,6 +41,8 @@ class EventFdLinux final : public EventFdBase {
|
||||
void release() override;
|
||||
|
||||
void acquire() override;
|
||||
|
||||
void wait(int timeout_ms) override;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user