You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2024/04/17 22:02:08 UTC

(qpid-proton) branch main updated: PROTON-2792: [C++] check that scheduled tasks are active under lock

This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git


The following commit(s) were added to refs/heads/main by this push:
     new 4b48f7d24 PROTON-2792: [C++] check that scheduled tasks are active under lock
4b48f7d24 is described below

commit 4b48f7d24ca83f221039c4e47ce42752f3b104ad
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Thu Mar 7 21:19:03 2024 -0500

    PROTON-2792: [C++] check that scheduled tasks are active under lock
    
    [Reapplied as it was accidentally reverted]
    
    Previously we checked whether the tasks were active without locking
    which was bad.
---
 cpp/include/proton/work_queue.hpp   |  2 +-
 cpp/src/proactor_container_impl.cpp | 13 ++++++++++---
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/cpp/include/proton/work_queue.hpp b/cpp/include/proton/work_queue.hpp
index e917fa3ce..defe1aaa7 100644
--- a/cpp/include/proton/work_queue.hpp
+++ b/cpp/include/proton/work_queue.hpp
@@ -280,7 +280,7 @@ class work {
     /// **Unsettled API**
     ///
     /// Execute the piece of work
-    void operator()() { item_(); }
+    void operator()() const { item_(); }
 
     ~work() = default;
 
diff --git a/cpp/src/proactor_container_impl.cpp b/cpp/src/proactor_container_impl.cpp
index e965be730..228002e38 100644
--- a/cpp/src/proactor_container_impl.cpp
+++ b/cpp/src/proactor_container_impl.cpp
@@ -542,9 +542,16 @@ void container::impl::run_timer_jobs() {
     // NB. We copied the due tasks in reverse order so execute from end
 
     for (int i = tasks.size()-1; i>=0; --i) {
-        if(is_active_.count(tasks[i].w_handle)) {
-            tasks[i].task();
-            is_active_.erase(tasks[i].w_handle);
+        const auto& task = tasks[i];
+        bool active;
+
+        {
+          GUARD(deferred_lock_);
+          // NB. erase returns the number of items erased
+          active = is_active_.erase(task.w_handle);
+        }
+        if (active) {
+            task.task();
         }
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org