From 98323d282c3253180d75754b62d2245dbdf4bcfe Mon Sep 17 00:00:00 2001 From: pointertobios Date: Wed, 6 May 2026 09:48:38 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20execution=5Fdomain::schedule=5Fexecu?= =?UTF-8?q?tion()=20=E5=81=B6=E5=8F=91=20get=20=E5=88=B0=E7=A9=BA=20hashma?= =?UTF-8?q?p=20guard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asco/core/task/cycle_scheduler.h | 8 ++++++++ asco/core/task/dynprio_scheduler.cpp | 1 + asco/core/worker.cpp | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/asco/core/task/cycle_scheduler.h b/asco/core/task/cycle_scheduler.h index d926329..eeb6a90 100644 --- a/asco/core/task/cycle_scheduler.h +++ b/asco/core/task/cycle_scheduler.h @@ -35,6 +35,7 @@ class cycle_scheduler : public scheduler { m_scheduler->m_active_count--; m_scheduler->m_domain->suspend_execution(state.id); } else { + state.preawaken = false; m_scheduler->m_domain->activate_execution(state.id); } state.suspend_now = false; @@ -74,6 +75,7 @@ class cycle_scheduler : public scheduler { asco_assert(!state.active); state.detached = true; state.id = execution_id{}; + m_execution_index_map[p.second] = {execution_id{}, -1}; m_detached_count++; break; } @@ -84,6 +86,9 @@ class cycle_scheduler : public scheduler { for (auto &p : m_execution_index_map) { if (p.first == id) { auto &state = m_executions[p.second]; + if (state.detached) { + break; + } if (!state.active) { state.suspend_now = false; state.active = true; @@ -107,6 +112,9 @@ class cycle_scheduler : public scheduler { for (auto &p : m_execution_index_map) { if (p.first == id) { auto &state = m_executions[p.second]; + if (state.detached) { + break; + } if (state.preawaken) { state.preawaken = false; break; diff --git a/asco/core/task/dynprio_scheduler.cpp b/asco/core/task/dynprio_scheduler.cpp index 0626162..30fde7c 100644 --- a/asco/core/task/dynprio_scheduler.cpp +++ b/asco/core/task/dynprio_scheduler.cpp @@ -46,6 +46,7 @@ void dynprio_scheduler::detach_suspended_execution(execution_id id) { if (m_suspended_executions.remove(id)) { m_exec_ctx_map.remove(id); } + m_preawake_executions.remove(id); } void dynprio_scheduler::awake_execution(execution_id id) noexcept { diff --git a/asco/core/worker.cpp b/asco/core/worker.cpp index 3e7cf55..eadc1c0 100644 --- a/asco/core/worker.cpp +++ b/asco/core/worker.cpp @@ -109,8 +109,8 @@ bool worker::run_once(std::stop_token &st) { if (!m_executor.execute(m_sexec_stack.back(), m_context_stack)) { auto &domain = *m_domain_stack.back(); auto exec = m_sexec_stack.back().m_id; - domain.get_scheduler().detach_suspended_execution(exec); domain.detach_execution(exec); + domain.get_scheduler().detach_suspended_execution(exec); } exit_stack(true); From 08840c554466412b99d804d19b83dba3dbc41a26 Mon Sep 17 00:00:00 2001 From: pointertobios Date: Wed, 6 May 2026 10:24:42 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 2 +- asco/core/task/cycle_scheduler.h | 2 +- asco/core/task/dynprio_scheduler.cpp | 5 ++--- asco/core/worker.cpp | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d5e6de..ba64d9a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,7 +72,7 @@ jobs: - name: Test shell: bash - run: ctest --test-dir build --output-on-failure + run: ./build/tests/tests - name: Upload build artifacts if: always() diff --git a/asco/core/task/cycle_scheduler.h b/asco/core/task/cycle_scheduler.h index eeb6a90..44abb8b 100644 --- a/asco/core/task/cycle_scheduler.h +++ b/asco/core/task/cycle_scheduler.h @@ -97,7 +97,7 @@ class cycle_scheduler : public scheduler { } else { state.preawaken = true; } - break; + return; } } diff --git a/asco/core/task/dynprio_scheduler.cpp b/asco/core/task/dynprio_scheduler.cpp index 30fde7c..9f5d45f 100644 --- a/asco/core/task/dynprio_scheduler.cpp +++ b/asco/core/task/dynprio_scheduler.cpp @@ -43,9 +43,8 @@ void dynprio_scheduler::attach_execution(execution_id id) { } void dynprio_scheduler::detach_suspended_execution(execution_id id) { - if (m_suspended_executions.remove(id)) { - m_exec_ctx_map.remove(id); - } + m_suspended_executions.remove(id); + m_exec_ctx_map.remove(id); m_preawake_executions.remove(id); } diff --git a/asco/core/worker.cpp b/asco/core/worker.cpp index eadc1c0..3e7cf55 100644 --- a/asco/core/worker.cpp +++ b/asco/core/worker.cpp @@ -109,8 +109,8 @@ bool worker::run_once(std::stop_token &st) { if (!m_executor.execute(m_sexec_stack.back(), m_context_stack)) { auto &domain = *m_domain_stack.back(); auto exec = m_sexec_stack.back().m_id; - domain.detach_execution(exec); domain.get_scheduler().detach_suspended_execution(exec); + domain.detach_execution(exec); } exit_stack(true);