From e789bb725ab0f92e068dbd989b5f7c427b5662f4 Mon Sep 17 00:00:00 2001 From: Chen Zhao Date: Fri, 13 Mar 2026 09:10:13 +0000 Subject: [PATCH 1/3] fix: reset module ptr when unregister_module --- src/bthread/eloq_module.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bthread/eloq_module.cpp b/src/bthread/eloq_module.cpp index 309e457d..9f514a9d 100644 --- a/src/bthread/eloq_module.cpp +++ b/src/bthread/eloq_module.cpp @@ -79,6 +79,7 @@ namespace eloq { registered_modules[i] = registered_modules[i + 1]; i++; } + registered_modules[registered_modules.size() - 1] = nullptr; registered_module_cnt.fetch_sub(1, std::memory_order_release); lk.unlock(); From 4860474195d82b70bde3588b489eb9dcc7a27cc8 Mon Sep 17 00:00:00 2001 From: Chen Zhao Date: Mon, 16 Mar 2026 05:43:35 +0000 Subject: [PATCH 2/3] fix --- src/bthread/eloq_module.cpp | 14 ++++++++++++++ src/bthread/task_group.cpp | 5 ++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/bthread/eloq_module.cpp b/src/bthread/eloq_module.cpp index 9f514a9d..71845ead 100644 --- a/src/bthread/eloq_module.cpp +++ b/src/bthread/eloq_module.cpp @@ -44,6 +44,13 @@ namespace eloq { } registered_modules[i] = module; registered_module_cnt.fetch_add(1, std::memory_order_release); + const auto non_null_modules = + std::count_if(registered_modules.begin(), registered_modules.end(), + [](EloqModule *registered_module) { + return registered_module != nullptr; + }); + CHECK_EQ(static_cast(non_null_modules), + registered_module_cnt.load(std::memory_order_acquire)); return 0; } @@ -81,6 +88,13 @@ namespace eloq { } registered_modules[registered_modules.size() - 1] = nullptr; registered_module_cnt.fetch_sub(1, std::memory_order_release); + const auto non_null_modules = + std::count_if(registered_modules.begin(), registered_modules.end(), + [](EloqModule *registered_module) { + return registered_module != nullptr; + }); + CHECK_EQ(static_cast(non_null_modules), + registered_module_cnt.load(std::memory_order_acquire)); lk.unlock(); while (module->registered_workers_.load(std::memory_order_acquire) != 0) { diff --git a/src/bthread/task_group.cpp b/src/bthread/task_group.cpp index e58d2a4e..92aa6d0d 100644 --- a/src/bthread/task_group.cpp +++ b/src/bthread/task_group.cpp @@ -1316,7 +1316,9 @@ bool TaskGroup::HasTasks() { } void TaskGroup::CheckAndUpdateModules() { - if (modules_cnt_ != registered_module_cnt.load(std::memory_order_acquire)) { + const int registered_module_count = + registered_module_cnt.load(std::memory_order_acquire); + if (modules_cnt_ != registered_module_count) { std::shared_lock lk(eloq::module_mutex); const auto old_registered_modules = registered_modules_; registered_modules_ = registered_modules; @@ -1324,6 +1326,7 @@ void TaskGroup::CheckAndUpdateModules() { const auto new_module_cnt = std::count_if(registered_modules_.begin(), registered_modules_.end(), [](eloq::EloqModule* module) { return module != nullptr; }); + CHECK_EQ(static_cast(new_module_cnt), registered_module_count); // new modules for (auto i = modules_cnt_; i < new_module_cnt; ++i) { registered_modules_[i]->registered_workers_.fetch_add(1, std::memory_order_relaxed); From 0f7336ca0f240395b2498c8d60928aeba1f887a4 Mon Sep 17 00:00:00 2001 From: Chen Zhao Date: Mon, 16 Mar 2026 06:51:18 +0000 Subject: [PATCH 3/3] fix --- src/bthread/task_group.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bthread/task_group.cpp b/src/bthread/task_group.cpp index 92aa6d0d..3126bfc3 100644 --- a/src/bthread/task_group.cpp +++ b/src/bthread/task_group.cpp @@ -1316,10 +1316,10 @@ bool TaskGroup::HasTasks() { } void TaskGroup::CheckAndUpdateModules() { - const int registered_module_count = - registered_module_cnt.load(std::memory_order_acquire); - if (modules_cnt_ != registered_module_count) { + if (modules_cnt_ != registered_module_cnt.load(std::memory_order_acquire)) { std::shared_lock lk(eloq::module_mutex); + const int registered_module_count = + registered_module_cnt.load(std::memory_order_acquire); const auto old_registered_modules = registered_modules_; registered_modules_ = registered_modules; lk.unlock();