diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-11-03 15:51:46 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-11-03 15:51:46 +0800 |
| commit | 1e1ccbff5cc4f4ec7d870ea1db985b08e37ed3f8 (patch) | |
| tree | 98962fdd8ca9a08098706b05acb4ed400b0a653a /include/cru/base/platform/unix/EventLoop.h | |
| parent | 9c897e8727d90345c2db7f36f52ab678778db936 (diff) | |
| download | cru-1e1ccbff5cc4f4ec7d870ea1db985b08e37ed3f8.tar.gz cru-1e1ccbff5cc4f4ec7d870ea1db985b08e37ed3f8.tar.bz2 cru-1e1ccbff5cc4f4ec7d870ea1db985b08e37ed3f8.zip | |
Use TimerRegistry in UnixEventLoop.
Diffstat (limited to 'include/cru/base/platform/unix/EventLoop.h')
| -rw-r--r-- | include/cru/base/platform/unix/EventLoop.h | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/include/cru/base/platform/unix/EventLoop.h b/include/cru/base/platform/unix/EventLoop.h index 4f445fa3..697c6f37 100644 --- a/include/cru/base/platform/unix/EventLoop.h +++ b/include/cru/base/platform/unix/EventLoop.h @@ -6,6 +6,7 @@ #include "../../Base.h" #include "../../Exception.h" +#include "../../Timer.h" #include "UnixFile.h" #include <poll.h> @@ -54,27 +55,43 @@ class UnixEventLoop : public Object2 { UnixEventLoop(); /** - * The only thread-safe function. + * Thread-safe. */ void QueueAction(std::function<void()> action); int Run(); void RequestQuit(int exit_code = 0); + /** + * Thread-safe. + */ int SetTimer(std::function<void()> action, std::chrono::milliseconds timeout, bool repeat); + + /** + * Thread-safe. + */ void CancelTimer(int id); + /** + * Thread-safe. + */ int SetImmediate(std::function<void()> action) { return this->SetTimer(std::move(action), std::chrono::milliseconds::zero(), false); } + /** + * Thread-safe. + */ int SetTimeout(std::function<void()> action, std::chrono::milliseconds timeout) { return this->SetTimer(std::move(action), std::move(timeout), false); } + /** + * Thread-safe. + */ int SetInterval(std::function<void()> action, std::chrono::milliseconds interval) { return this->SetTimer(std::move(action), std::move(interval), true); @@ -84,25 +101,7 @@ class UnixEventLoop : public Object2 { void RemovePoll(int fd); private: - struct TimerData { - int id; - std::chrono::milliseconds original_timeout; - std::chrono::milliseconds timeout; - bool repeat; - std::function<void()> action; - - TimerData(int id, std::chrono::milliseconds timeout, bool repeat, - std::function<void()> action) - : id(id), - original_timeout(timeout), - timeout(timeout), - repeat(repeat), - action(std::move(action)) {} - }; - - private: bool CheckPoll(); - bool CheckTimer(); bool CheckActionPipe(); private: @@ -111,8 +110,7 @@ class UnixEventLoop : public Object2 { std::vector<pollfd> polls_; std::vector<PollHandler> poll_actions_; - int timer_tag_; - std::vector<TimerData> timers_; + TimerRegistry<std::function<void()>> timer_registry_; UnixFileDescriptor action_pipe_read_end_; UnixFileDescriptor action_pipe_write_end_; |
