From 9d928a684837826aed86b4578c3722c86e8f1c4d Mon Sep 17 00:00:00 2001 From: Hevake Date: Wed, 9 Mar 2022 07:57:38 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=B0=8F=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E4=B8=8D=E5=BD=B1=E5=93=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- event/engins/epoll/loop.cpp | 6 ------ event/engins/epoll/loop.h | 10 +++++----- event/engins/epoll/timer_event.h | 14 +++++++------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/event/engins/epoll/loop.cpp b/event/engins/epoll/loop.cpp index 8c0b314..196cc44 100644 --- a/event/engins/epoll/loop.cpp +++ b/event/engins/epoll/loop.cpp @@ -121,13 +121,7 @@ void EpollLoop::runLoop(Mode mode) /// If the receiver array size is full, increase its size with 1.5 times. if (fds >= max_loop_entries_) { max_loop_entries_ = (max_loop_entries_ + max_loop_entries_ / 2); -#if 0 - std::vector temp_events; - temp_events.resize(max_loop_entries_); - events.swap(temp_events); -#else events.resize(max_loop_entries_); -#endif } } while (keep_running_); diff --git a/event/engins/epoll/loop.h b/event/engins/epoll/loop.h index c62f1e6..4f117f8 100644 --- a/event/engins/epoll/loop.h +++ b/event/engins/epoll/loop.h @@ -20,14 +20,14 @@ struct EpollFdSharedData; class EpollLoop : public CommonLoop { public: explicit EpollLoop(); - virtual ~EpollLoop(); + ~EpollLoop() override; public: - virtual void runLoop(Mode mode); - virtual void exitLoop(const std::chrono::milliseconds &wait_time); + void runLoop(Mode mode) override; + void exitLoop(const std::chrono::milliseconds &wait_time) override; - virtual FdEvent* newFdEvent(); - virtual TimerEvent* newTimerEvent(); + FdEvent* newFdEvent() override; + TimerEvent* newTimerEvent() override; public: inline int epollFd() const { return epoll_fd_; } diff --git a/event/engins/epoll/timer_event.h b/event/engins/epoll/timer_event.h index d84acdc..3cc23f7 100644 --- a/event/engins/epoll/timer_event.h +++ b/event/engins/epoll/timer_event.h @@ -12,17 +12,17 @@ class EpollLoop; class EpollTimerEvent : public TimerEvent { public: explicit EpollTimerEvent(EpollLoop *wp_loop); - virtual ~EpollTimerEvent(); + ~EpollTimerEvent() override; public: - virtual bool initialize(const std::chrono::milliseconds &interval, Mode mode); - virtual void setCallback(const CallbackFunc &cb); + bool initialize(const std::chrono::milliseconds &interval, Mode mode) override; + void setCallback(const CallbackFunc &cb) override; - virtual bool isEnabled() const; - virtual bool enable(); - virtual bool disable(); + bool isEnabled() const override; + bool enable() override; + bool disable() override; - virtual Loop* getLoop() const; + Loop* getLoop() const override; protected: void onEvent(); -- Gitee From 2e651c1d61df392951f938ef15e1e691a5e18778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E5=8D=AB=E5=93=A5?= Date: Wed, 9 Mar 2022 00:51:59 +0000 Subject: [PATCH 2/9] =?UTF-8?q?update=20README.md.=20=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=85=B3=E7=B3=BB=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/README.md b/README.md index 145e065..17be2ce 100644 --- a/README.md +++ b/README.md @@ -39,16 +39,7 @@ cpp\_tbox,全称: C++ Treasure Box,C++开发百宝箱,是基于事件的 #### 模块间依赖 -- base --> None -- util --> base -- event --> base, util -- eventx --> event -- network --> event -- coroutine --> event -- mqtt --> event -- terminal --> network -- main --> eventx, network -- sample --> main +![](http://assets.processon.com/chart_image/6227efafe401fd18bcfc83e8.png) #### 模块裁减 -- Gitee From 3fb2b650e89b87f88f103d0ecdbb53fe3813a451 Mon Sep 17 00:00:00 2001 From: Hevake Date: Thu, 10 Mar 2022 07:55:39 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E9=92=88=E5=AF=B9event=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- event/common_loop.h | 22 +++++++++++----------- event/engins/epoll/fd_event.h | 14 +++++++------- event/engins/epoll/loop.h | 10 +++++----- event/engins/epoll/timer_event.h | 14 +++++++------- event/engins/libev/timer_event.h | 14 +++++++------- event/engins/libevent/fd_event.h | 14 +++++++------- event/engins/libevent/loop.h | 10 +++++----- event/engins/libevent/timer_event.h | 14 +++++++------- 8 files changed, 56 insertions(+), 56 deletions(-) diff --git a/event/common_loop.h b/event/common_loop.h index c29982a..9b06ba3 100644 --- a/event/common_loop.h +++ b/event/common_loop.h @@ -19,27 +19,27 @@ namespace event { class CommonLoop : public Loop { public: - ~CommonLoop() override; + virtual ~CommonLoop() override; public: - bool isInLoopThread() override; - bool isRunning() const override; + virtual bool isInLoopThread() override; + virtual bool isRunning() const override; - void runInLoop(const Func &func) override; - void runNext(const Func &func) override; - void run(const Func &func) override; + virtual void runInLoop(const Func &func) override; + virtual void runNext(const Func &func) override; + virtual void run(const Func &func) override; - void setStatEnable(bool enable) override; - bool isStatEnabled() const override; - Stat getStat() const override; - void resetStat() override; + virtual void setStatEnable(bool enable) override; + virtual bool isStatEnabled() const override; + virtual Stat getStat() const override; + virtual void resetStat() override; public: void beginEventProcess(); void endEventProcess(); //! 信号处理相关 - SignalEvent* newSignalEvent() override; + virtual SignalEvent* newSignalEvent() override; bool subscribeSignal(int signal_num, SignalSubscribuer *who); bool unsubscribeSignal(int signal_num, SignalSubscribuer *who); static void HandleSignal(int signo); diff --git a/event/engins/epoll/fd_event.h b/event/engins/epoll/fd_event.h index ffada80..7d8a2de 100644 --- a/event/engins/epoll/fd_event.h +++ b/event/engins/epoll/fd_event.h @@ -14,17 +14,17 @@ struct EpollFdSharedData; class EpollFdEvent : public FdEvent { public: explicit EpollFdEvent(EpollLoop *wp_loop); - ~EpollFdEvent() override; + virtual ~EpollFdEvent() override; public: - bool initialize(int fd, short events, Mode mode) override; - void setCallback(const CallbackFunc &cb) override { cb_ = cb; } + virtual bool initialize(int fd, short events, Mode mode) override; + virtual void setCallback(const CallbackFunc &cb) override { cb_ = cb; } - bool isEnabled() const override{ return is_enabled_; } - bool enable() override; - bool disable() override; + virtual bool isEnabled() const override{ return is_enabled_; } + virtual bool enable() override; + virtual bool disable() override; - Loop* getLoop() const override; + virtual Loop* getLoop() const override; public: static void OnEventCallback(int fd, uint32_t events, void *obj); diff --git a/event/engins/epoll/loop.h b/event/engins/epoll/loop.h index 4f117f8..ed40c3d 100644 --- a/event/engins/epoll/loop.h +++ b/event/engins/epoll/loop.h @@ -20,14 +20,14 @@ struct EpollFdSharedData; class EpollLoop : public CommonLoop { public: explicit EpollLoop(); - ~EpollLoop() override; + virtual ~EpollLoop() override; public: - void runLoop(Mode mode) override; - void exitLoop(const std::chrono::milliseconds &wait_time) override; + virtual void runLoop(Mode mode) override; + virtual void exitLoop(const std::chrono::milliseconds &wait_time) override; - FdEvent* newFdEvent() override; - TimerEvent* newTimerEvent() override; + virtual FdEvent* newFdEvent() override; + virtual TimerEvent* newTimerEvent() override; public: inline int epollFd() const { return epoll_fd_; } diff --git a/event/engins/epoll/timer_event.h b/event/engins/epoll/timer_event.h index 3cc23f7..c01bc67 100644 --- a/event/engins/epoll/timer_event.h +++ b/event/engins/epoll/timer_event.h @@ -12,17 +12,17 @@ class EpollLoop; class EpollTimerEvent : public TimerEvent { public: explicit EpollTimerEvent(EpollLoop *wp_loop); - ~EpollTimerEvent() override; + virtual ~EpollTimerEvent() override; public: - bool initialize(const std::chrono::milliseconds &interval, Mode mode) override; - void setCallback(const CallbackFunc &cb) override; + virtual bool initialize(const std::chrono::milliseconds &interval, Mode mode) override; + virtual void setCallback(const CallbackFunc &cb) override; - bool isEnabled() const override; - bool enable() override; - bool disable() override; + virtual bool isEnabled() const override; + virtual bool enable() override; + virtual bool disable() override; - Loop* getLoop() const override; + virtual Loop* getLoop() const override; protected: void onEvent(); diff --git a/event/engins/libev/timer_event.h b/event/engins/libev/timer_event.h index e4893db..82e68f7 100644 --- a/event/engins/libev/timer_event.h +++ b/event/engins/libev/timer_event.h @@ -13,17 +13,17 @@ class LibevLoop; class LibevTimerEvent : public TimerEvent { public: explicit LibevTimerEvent(LibevLoop *wp_loop); - virtual ~LibevTimerEvent(); + virtual ~LibevTimerEvent() override; public: - virtual bool initialize(const std::chrono::milliseconds &interval, Mode mode); - virtual void setCallback(const CallbackFunc &cb); + virtual bool initialize(const std::chrono::milliseconds &interval, Mode mode) override; + virtual void setCallback(const CallbackFunc &cb) override; - virtual bool isEnabled() const; - virtual bool enable(); - virtual bool disable(); + virtual bool isEnabled() const override; + virtual bool enable() override; + virtual bool disable() override; - virtual Loop* getLoop() const; + virtual Loop* getLoop() const override; protected: static void OnEventCallback(struct ev_loop*, ev_timer *p_w, int events); diff --git a/event/engins/libevent/fd_event.h b/event/engins/libevent/fd_event.h index e2bba26..aec5d3c 100644 --- a/event/engins/libevent/fd_event.h +++ b/event/engins/libevent/fd_event.h @@ -12,17 +12,17 @@ class LibeventLoop; class LibeventFdEvent : public FdEvent { public: explicit LibeventFdEvent(LibeventLoop *wp_loop); - virtual ~LibeventFdEvent(); + virtual ~LibeventFdEvent() override; public: - virtual bool initialize(int fd, short events, Mode mode); - virtual void setCallback(const CallbackFunc &cb); + virtual bool initialize(int fd, short events, Mode mode) override; + virtual void setCallback(const CallbackFunc &cb) override; - virtual bool isEnabled() const; - virtual bool enable(); - virtual bool disable(); + virtual bool isEnabled() const override; + virtual bool enable() override; + virtual bool disable() override; - virtual Loop* getLoop() const; + virtual Loop* getLoop() const override; protected: static void OnEventCallback(int fd, short events, void *args); diff --git a/event/engins/libevent/loop.h b/event/engins/libevent/loop.h index 58a9fe9..281bdb5 100644 --- a/event/engins/libevent/loop.h +++ b/event/engins/libevent/loop.h @@ -11,14 +11,14 @@ namespace event { class LibeventLoop : public CommonLoop { public: explicit LibeventLoop(); - virtual ~LibeventLoop(); + virtual ~LibeventLoop() override; public: - virtual void runLoop(Mode mode); - virtual void exitLoop(const std::chrono::milliseconds &wait_time); + virtual void runLoop(Mode mode) override; + virtual void exitLoop(const std::chrono::milliseconds &wait_time) override; - virtual FdEvent* newFdEvent(); - virtual TimerEvent* newTimerEvent(); + virtual FdEvent* newFdEvent() override; + virtual TimerEvent* newTimerEvent() override; public: struct event_base* getEventBasePtr() const { return sp_event_base_; } diff --git a/event/engins/libevent/timer_event.h b/event/engins/libevent/timer_event.h index 24edcb9..537230b 100644 --- a/event/engins/libevent/timer_event.h +++ b/event/engins/libevent/timer_event.h @@ -12,17 +12,17 @@ class LibeventLoop; class LibeventTimerEvent : public TimerEvent { public: explicit LibeventTimerEvent(LibeventLoop *wp_loop); - virtual ~LibeventTimerEvent(); + virtual ~LibeventTimerEvent() override; public: - virtual bool initialize(const std::chrono::milliseconds &interval, Mode mode); - virtual void setCallback(const CallbackFunc &cb); + virtual bool initialize(const std::chrono::milliseconds &interval, Mode mode) override; + virtual void setCallback(const CallbackFunc &cb) override; - virtual bool isEnabled() const; - virtual bool enable(); - virtual bool disable(); + virtual bool isEnabled() const override; + virtual bool enable() override; + virtual bool disable() override; - virtual Loop* getLoop() const; + virtual Loop* getLoop() const override; protected: static void OnEventCallback(int, short, void *args); -- Gitee From 2abfb2be5f4fa688672dc0b73e464bb5cd53ffae Mon Sep 17 00:00:00 2001 From: Hevake Date: Thu, 10 Mar 2022 08:10:45 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E4=BC=98=E5=8C=96event=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- event/config.mk | 4 ++-- event/engins/epoll/loop.h | 8 ++++---- event/engins/epoll/timer_event.h | 12 ++++++------ event/engins/libev/fd_event.cpp | 5 +---- event/engins/libev/fd_event.h | 6 +++--- event/engins/libev/loop.cpp | 3 +-- event/engins/libev/loop.h | 2 +- event/engins/libev/timer_event.cpp | 5 +---- event/engins/libev/timer_event.h | 6 +++--- event/engins/libevent/fd_event.cpp | 5 +---- event/engins/libevent/fd_event.h | 6 +++--- event/engins/libevent/timer_event.cpp | 4 +--- event/engins/libevent/timer_event.h | 6 +++--- 13 files changed, 30 insertions(+), 42 deletions(-) diff --git a/event/config.mk b/event/config.mk index 48da8d5..d8045f6 100644 --- a/event/config.mk +++ b/event/config.mk @@ -1,5 +1,5 @@ -#ENABLE_LIBEVENT = yes -#ENABLE_LIBEV = yes +ENABLE_LIBEVENT = yes +ENABLE_LIBEV = yes ENABLE_EPOLL = yes ENABLE_STAT = yes diff --git a/event/engins/epoll/loop.h b/event/engins/epoll/loop.h index ed40c3d..c63b48c 100644 --- a/event/engins/epoll/loop.h +++ b/event/engins/epoll/loop.h @@ -61,11 +61,11 @@ class EpollLoop : public CommonLoop { }; private: - int max_loop_entries_{ DEFAULT_MAX_LOOP_ENTRIES }; - int epoll_fd_{ -1 }; - bool keep_running_{ true }; + int max_loop_entries_ = DEFAULT_MAX_LOOP_ENTRIES; + int epoll_fd_ = -1; + bool keep_running_ = true; - TimerEvent *sp_exit_timer_{ nullptr }; + TimerEvent *sp_exit_timer_ = nullptr; cabinet::Cabinet timer_cabinet_; std::vector timer_min_heap_; diff --git a/event/engins/epoll/timer_event.h b/event/engins/epoll/timer_event.h index c01bc67..f0965d0 100644 --- a/event/engins/epoll/timer_event.h +++ b/event/engins/epoll/timer_event.h @@ -29,14 +29,14 @@ class EpollTimerEvent : public TimerEvent { private: EpollLoop *wp_loop_; - bool is_inited_{ false }; - bool is_enabled_{ false }; + bool is_inited_ = false; + bool is_enabled_ = false; - std::chrono::milliseconds interval_{ 0 }; - Mode mode_{ Mode::kOneshot }; + std::chrono::milliseconds interval_; + Mode mode_ = Mode::kOneshot; - CallbackFunc cb_{ nullptr }; - int cb_level_{ 0 }; + CallbackFunc cb_; + int cb_level_ = 0; cabinet::Token token_; }; diff --git a/event/engins/libev/fd_event.cpp b/event/engins/libev/fd_event.cpp index d486b3c..ffb73cb 100644 --- a/event/engins/libev/fd_event.cpp +++ b/event/engins/libev/fd_event.cpp @@ -9,10 +9,7 @@ namespace tbox { namespace event { LibevFdEvent::LibevFdEvent(LibevLoop *wp_loop) : - wp_loop_(wp_loop), - is_inited_(false), - is_stop_after_trigger_(false), - cb_level_(0) + wp_loop_(wp_loop) { memset(&io_ev_, 0, sizeof(io_ev_)); } diff --git a/event/engins/libev/fd_event.h b/event/engins/libev/fd_event.h index e4ce049..0f91fa5 100644 --- a/event/engins/libev/fd_event.h +++ b/event/engins/libev/fd_event.h @@ -32,10 +32,10 @@ class LibevFdEvent : public FdEvent { private: LibevLoop *wp_loop_; ev_io io_ev_; - bool is_inited_; - bool is_stop_after_trigger_; + bool is_inited_ = false; + bool is_stop_after_trigger_ = false; CallbackFunc cb_; - int cb_level_; + int cb_level_ = 0; }; } diff --git a/event/engins/libev/loop.cpp b/event/engins/libev/loop.cpp index f7a6e63..b7c9b1e 100644 --- a/event/engins/libev/loop.cpp +++ b/event/engins/libev/loop.cpp @@ -9,8 +9,7 @@ namespace tbox { namespace event { LibevLoop::LibevLoop() : - sp_ev_loop_(ev_loop_new()), - sp_exit_timer_(nullptr) + sp_ev_loop_(ev_loop_new()) { } LibevLoop::~LibevLoop() diff --git a/event/engins/libev/loop.h b/event/engins/libev/loop.h index 9087bd2..8909d39 100644 --- a/event/engins/libev/loop.h +++ b/event/engins/libev/loop.h @@ -28,7 +28,7 @@ class LibevLoop : public CommonLoop { private: struct ev_loop *sp_ev_loop_; - TimerEvent *sp_exit_timer_; + TimerEvent *sp_exit_timer_ = nullptr; }; } diff --git a/event/engins/libev/timer_event.cpp b/event/engins/libev/timer_event.cpp index ccad7fb..c71b233 100644 --- a/event/engins/libev/timer_event.cpp +++ b/event/engins/libev/timer_event.cpp @@ -9,10 +9,7 @@ namespace tbox { namespace event { LibevTimerEvent::LibevTimerEvent(LibevLoop *wp_loop) : - wp_loop_(wp_loop), - is_inited_(false), - mode_(Mode::kOneshot), - cb_level_(0) + wp_loop_(wp_loop) { memset(&timer_ev_, 0, sizeof(timer_ev_)); } diff --git a/event/engins/libev/timer_event.h b/event/engins/libev/timer_event.h index 82e68f7..4699e5f 100644 --- a/event/engins/libev/timer_event.h +++ b/event/engins/libev/timer_event.h @@ -32,13 +32,13 @@ class LibevTimerEvent : public TimerEvent { private: LibevLoop *wp_loop_; ev_timer timer_ev_; - bool is_inited_; + bool is_inited_ = false; std::chrono::milliseconds interval_; - Mode mode_; + Mode mode_ = Mode::kOneshot; CallbackFunc cb_; - int cb_level_; + int cb_level_ = 0; }; } diff --git a/event/engins/libevent/fd_event.cpp b/event/engins/libevent/fd_event.cpp index db0fbc8..77ac68c 100644 --- a/event/engins/libevent/fd_event.cpp +++ b/event/engins/libevent/fd_event.cpp @@ -10,10 +10,7 @@ namespace tbox { namespace event { LibeventFdEvent::LibeventFdEvent(LibeventLoop *wp_loop) : - wp_loop_(wp_loop), - is_inited_(false), - events_(0), - cb_level_(0) + wp_loop_(wp_loop) { event_assign(&event_, NULL, -1, 0, NULL, NULL); } diff --git a/event/engins/libevent/fd_event.h b/event/engins/libevent/fd_event.h index aec5d3c..8a9fc2a 100644 --- a/event/engins/libevent/fd_event.h +++ b/event/engins/libevent/fd_event.h @@ -32,10 +32,10 @@ class LibeventFdEvent : public FdEvent { LibeventLoop *wp_loop_; struct event event_; - bool is_inited_; - short events_; + bool is_inited_ = false; + short events_ = 0; CallbackFunc cb_; - int cb_level_; + int cb_level_ = 0; }; } diff --git a/event/engins/libevent/timer_event.cpp b/event/engins/libevent/timer_event.cpp index 55784da..4d0a12b 100644 --- a/event/engins/libevent/timer_event.cpp +++ b/event/engins/libevent/timer_event.cpp @@ -11,9 +11,7 @@ namespace tbox { namespace event { LibeventTimerEvent::LibeventTimerEvent(LibeventLoop *wp_loop) : - wp_loop_(wp_loop), - is_inited_(false), - cb_level_(0) + wp_loop_(wp_loop) { event_assign(&event_, NULL, -1, 0, NULL, NULL); } diff --git a/event/engins/libevent/timer_event.h b/event/engins/libevent/timer_event.h index 537230b..d06ef9a 100644 --- a/event/engins/libevent/timer_event.h +++ b/event/engins/libevent/timer_event.h @@ -31,10 +31,10 @@ class LibeventTimerEvent : public TimerEvent { private: LibeventLoop *wp_loop_; struct event event_; - bool is_inited_; - struct timeval interval_; + bool is_inited_ = false; + struct timeval interval_ = { 0, 0 }; CallbackFunc cb_; - int cb_level_; + int cb_level_ = 0; }; } -- Gitee From 02f3a3e957b9c711b590d34b67b9975bcd6ab82e Mon Sep 17 00:00:00 2001 From: Hevake Date: Thu, 10 Mar 2022 08:41:53 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=AF=B9eventx=E4=B8=AD=E7=9A=84ThreadPool?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BF=AE=E6=94=B9=EF=BC=8C=E4=B8=8D=E5=85=81?= =?UTF-8?q?=E8=AE=B8max=5Fthread=5Fnum=E4=B8=BA0=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E9=99=90=E5=88=B6=E7=BA=BF=E7=A8=8B=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- event/config.mk | 4 ++-- eventx/thread_pool.cpp | 15 +++++++-------- eventx/thread_pool.h | 5 +++-- main/context_imp.cpp | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/event/config.mk b/event/config.mk index d8045f6..48da8d5 100644 --- a/event/config.mk +++ b/event/config.mk @@ -1,5 +1,5 @@ -ENABLE_LIBEVENT = yes -ENABLE_LIBEV = yes +#ENABLE_LIBEVENT = yes +#ENABLE_LIBEV = yes ENABLE_EPOLL = yes ENABLE_STAT = yes diff --git a/eventx/thread_pool.cpp b/eventx/thread_pool.cpp index a76dd78..dec4532 100644 --- a/eventx/thread_pool.cpp +++ b/eventx/thread_pool.cpp @@ -62,7 +62,7 @@ ThreadPool::~ThreadPool() delete d_; } -bool ThreadPool::initialize(int min_thread_num, int max_thread_num) +bool ThreadPool::initialize(size_t min_thread_num, size_t max_thread_num) { if (d_->is_ready) { LogWarn("it has ready, cleanup() first"); @@ -70,8 +70,8 @@ bool ThreadPool::initialize(int min_thread_num, int max_thread_num) } if (max_thread_num < 0 || min_thread_num < 0 || - (max_thread_num != 0 && min_thread_num > max_thread_num)) { - LogWarn("max_thread_num or min_thread_num invalid, max:%d, min:%d", max_thread_num, min_thread_num); + min_thread_num > max_thread_num || max_thread_num == 0) { + LogWarn("min_thread_num or max_thread_num invalid, min:%d, max:%d", min_thread_num, max_thread_num); return false; } @@ -80,7 +80,7 @@ bool ThreadPool::initialize(int min_thread_num, int max_thread_num) d_->min_thread_num = min_thread_num; d_->max_thread_num = max_thread_num; - for (int i = 0; i < min_thread_num; ++i) + for (size_t i = 0; i < min_thread_num; ++i) if (!createWorker()) return false; } @@ -124,8 +124,7 @@ ThreadPool::TaskToken ThreadPool::execute(const NonReturnFunc &backend_task, con d_->undo_tasks_token.at(level).push_back(token); //! 如果空间线程不够,且还可以再创建新的线程 - if (d_->idle_thread_num == 0 && - (d_->max_thread_num == 0 || d_->threads_cabinet.size() < d_->max_thread_num)) + if (d_->idle_thread_num == 0 && d_->threads_cabinet.size() < d_->max_thread_num) createWorker(); } @@ -208,8 +207,8 @@ void ThreadPool::threadProc(ThreadToken thread_token) /** * 为防止反复创建线程,此处做优化: - * 如果当前已有空闲的线程在等待,且当前的线程个数已超过长驻线程数,说明线程数据已满足现有要求 - * 则退出当前线程 + * 如果当前已有空闲的线程在等待,且当前的线程个数已超过长驻线程数,说明线程数据已满足现有要求则退出当前线程 + * 但这也会引起另一个小问题:如果 min_thread_num = 0,那么一旦执行过一次,线程池中至少会保留一个工作线程 */ if (d_->idle_thread_num > 0 && d_->threads_cabinet.size() > d_->min_thread_num) { LogDbg("thread %u will exit, no more work.", thread_token.id()); diff --git a/eventx/thread_pool.h b/eventx/thread_pool.h index 6d2de09..55e4afc 100644 --- a/eventx/thread_pool.h +++ b/eventx/thread_pool.h @@ -1,6 +1,7 @@ #ifndef TBOX_THREAD_POOL_H #define TBOX_THREAD_POOL_H +#include #include #include #include @@ -27,11 +28,11 @@ class ThreadPool { * 初始化线程池,指定常驻线程数与最大线程数 * * \param min_thread_num 常驻线程数,必须 >=0 - * \param max_thread_num 最大线程数,必须 >=0,=0表示不限定最大线程数量 + * \param max_thread_num 最大线程数,必须 >= min_thread_num 且 > 0 * * \return bool 是否成功 */ - bool initialize(int min_thread_num = 0, int max_thread_num = 0); + bool initialize(size_t min_thread_num = 0, size_t max_thread_num = std::numeric_limits::max()); using NonReturnFunc = std::function; diff --git a/main/context_imp.cpp b/main/context_imp.cpp index a7ecc62..400c15b 100644 --- a/main/context_imp.cpp +++ b/main/context_imp.cpp @@ -39,7 +39,7 @@ ContextImp::~ContextImp() void ContextImp::fillDefaultConfig(Json &cfg) const { - cfg["thread_pool"] = R"({"min":1, "max":0})"_json; + cfg["thread_pool"] = R"({"min":1, "max":5})"_json; } bool ContextImp::initialize(const Json &cfg) -- Gitee From dbacd141d921ac7735455272cfe52056ed9a5e1e Mon Sep 17 00:00:00 2001 From: Hevake Date: Thu, 10 Mar 2022 08:48:08 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86event/config.mk?= =?UTF-8?q?=EF=BC=8C=E5=85=B3=E9=97=ADlibevent,libev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.mk b/config.mk index ddec6b7..577bc36 100644 --- a/config.mk +++ b/config.mk @@ -1,11 +1,11 @@ app_y += base -app_y += util app_y += event app_y += eventx app_y += network app_y += coroutine app_y += mqtt app_y += log2file +app_y += util app_y += terminal app_y += main app_y += sample -- Gitee From e494a5e896f68f253cdbf0c8e64b0af684c18840 Mon Sep 17 00:00:00 2001 From: Hevake Date: Fri, 11 Mar 2022 08:18:04 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9ThreadPool=EF=BC=8C?= =?UTF-8?q?=E7=BB=99=E5=AE=83=E6=B7=BB=E5=8A=A0=E4=BA=86getTaskStatus()?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eventx/thread_pool.cpp | 13 +++++++++ eventx/thread_pool.h | 9 ++++++ eventx/thread_pool_test.cpp | 57 +++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/eventx/thread_pool.cpp b/eventx/thread_pool.cpp index dec4532..b3ddc30 100644 --- a/eventx/thread_pool.cpp +++ b/eventx/thread_pool.cpp @@ -134,6 +134,19 @@ ThreadPool::TaskToken ThreadPool::execute(const NonReturnFunc &backend_task, con return token; } +ThreadPool::TaskStatus ThreadPool::getTaskStatus(TaskToken task_token) const +{ + std::lock_guard lg(d_->lock); + + if (d_->undo_tasks_cabinet.at(task_token) != nullptr) + return TaskStatus::kWaiting; + + if (d_->doing_tasks_token.find(task_token) != d_->doing_tasks_token.end()) + return TaskStatus::kExecuting; + + return TaskStatus::kNotFound; +} + /** * 返回值如下: * 0: 取消成功 diff --git a/eventx/thread_pool.h b/eventx/thread_pool.h index 55e4afc..b8dedd4 100644 --- a/eventx/thread_pool.h +++ b/eventx/thread_pool.h @@ -57,6 +57,15 @@ class ThreadPool { */ TaskToken execute(const NonReturnFunc &backend_task, const NonReturnFunc &main_cb, int prio = 0); + enum class TaskStatus { + kWaiting, //! 等待中 + kExecuting, //! 执行中 + kNotFound //! 未找到(可能已完成) + }; + + //! 获取任务的状态 + TaskStatus getTaskStatus(TaskToken task_token) const; + /** * 取消任务 * diff --git a/eventx/thread_pool_test.cpp b/eventx/thread_pool_test.cpp index c4c163a..ea328a6 100644 --- a/eventx/thread_pool_test.cpp +++ b/eventx/thread_pool_test.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "thread_pool.h" @@ -168,4 +169,60 @@ TEST(ThreadPool, prio) { delete loop; } +/** + * 优先级 + * + * 期望优先级最高的先被执行 + */ +TEST(ThreadPool, getStatus) { + Loop *loop = Loop::New(); + + ThreadPool *tp = new ThreadPool(loop); + ASSERT_TRUE(tp->initialize(1,1)); + + auto task1 = tp->execute([] { std::this_thread::sleep_for(std::chrono::milliseconds(100)); }); + auto task2 = tp->execute([] { std::this_thread::sleep_for(std::chrono::milliseconds(100)); }); + + auto t1 = loop->newTimerEvent(); + t1->initialize(chrono::milliseconds(50), Event::Mode::kOneshot); + t1->enable(); + t1->setCallback( + [&] { + EXPECT_EQ(tp->getTaskStatus(task1), ThreadPool::TaskStatus::kExecuting); + EXPECT_EQ(tp->getTaskStatus(task2), ThreadPool::TaskStatus::kWaiting); + } + ); + + auto t2 = loop->newTimerEvent(); + t2->initialize(chrono::milliseconds(150), Event::Mode::kOneshot); + t2->enable(); + t2->setCallback( + [&] { + EXPECT_EQ(tp->getTaskStatus(task1), ThreadPool::TaskStatus::kNotFound); + EXPECT_EQ(tp->getTaskStatus(task2), ThreadPool::TaskStatus::kExecuting); + } + ); + + auto t3 = loop->newTimerEvent(); + t3->initialize(chrono::milliseconds(250), Event::Mode::kOneshot); + t3->enable(); + t3->setCallback( + [&] { + EXPECT_EQ(tp->getTaskStatus(task1), ThreadPool::TaskStatus::kNotFound); + EXPECT_EQ(tp->getTaskStatus(task2), ThreadPool::TaskStatus::kNotFound); + } + ); + + loop->exitLoop(std::chrono::milliseconds(300)); + loop->runLoop(); + + tp->cleanup(); + + delete t3; + delete t2; + delete t1; + delete tp; + delete loop; +} + } -- Gitee From d12328feb3877184d5b460456b9f77d9cda3c458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E5=8D=AB=E5=93=A5?= Date: Fri, 11 Mar 2022 00:21:45 +0000 Subject: [PATCH 8/9] update README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 17be2ce..980963e 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ cpp\_tbox,全称: C++ Treasure Box,C++开发百宝箱,是基于事件的 | 库名 | 依赖模块 | 说明 | 安装方法 | |:----:|:--------:|:----:|:--------:| -| googletest | 所有模块 | 单元测试要用 | apt install google-mock | +| googletest | 所有模块 | 单元测试用,如果不进行单元测试可忽略 | apt install google-mock | | libevent | event | 在event/config.mk中开启了WITH\_LIBEVENT时依赖 | apt install libevent-dev | | libev | event | 在event/config.mk中开启了WITH\_LIBEV时依赖 | apt install libev-dev | | mosquitto | mqtt | MQTT client库 | apt install libmosquitto-dev | -- Gitee From 93cd43b61f0d9b1e3a996aafbf00df07c61de967 Mon Sep 17 00:00:00 2001 From: Hevake Date: Thu, 17 Mar 2022 08:18:18 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E5=AF=B9terminal=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=B0=8F=E4=BC=98=E5=8C=96=EF=BC=8C=E5=8E=BB=E9=99=A4=E4=BA=86?= =?UTF-8?q?Func=E4=B8=AD=E5=A4=9A=E4=BD=99=E7=9A=84help=5F=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/context_imp.cpp | 2 +- terminal/impl/func_node.cpp | 2 +- terminal/impl/func_node.h | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/main/context_imp.cpp b/main/context_imp.cpp index 400c15b..6ce1255 100644 --- a/main/context_imp.cpp +++ b/main/context_imp.cpp @@ -116,7 +116,7 @@ void ContextImp::buildTerminalNodes() TerminalNodes *wp_nodes = sp_terminal_; auto ctx_node = wp_nodes->createDirNode("This is Context directory"); - wp_nodes->mountNode(wp_nodes->rootNode(), ctx_node, "context"); + wp_nodes->mountNode(wp_nodes->rootNode(), ctx_node, "ctx"); auto loop_node = wp_nodes->createDirNode("This is Loop directory"); wp_nodes->mountNode(ctx_node, loop_node, "loop"); diff --git a/terminal/impl/func_node.cpp b/terminal/impl/func_node.cpp index 15b767b..0a9ada2 100644 --- a/terminal/impl/func_node.cpp +++ b/terminal/impl/func_node.cpp @@ -2,7 +2,7 @@ namespace tbox::terminal { FuncNode::FuncNode(const Func &func, const std::string &help) : - Node(help), func_(func), help_(help) + Node(help), func_(func) { } void FuncNode::execute(const Session &s, const Args &a) const diff --git a/terminal/impl/func_node.h b/terminal/impl/func_node.h index a985724..bf6d017 100644 --- a/terminal/impl/func_node.h +++ b/terminal/impl/func_node.h @@ -15,7 +15,6 @@ class FuncNode : public Node { private: Func func_; - std::string help_; }; } -- Gitee