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 2026/05/29 21:29:53 UTC
(qpid-proton) 07/07: PROTON-2834: [C++] Container stop should ignore cancelled timers
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
commit 3206e809dafd09dfd771aee51bfc1d19ae8893be
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Fri May 15 18:53:49 2026 -0400
PROTON-2834: [C++] Container stop should ignore cancelled timers
Container stop is documented to stop the container after queued qork is
completed. However if shouldn't wait for any timer work that has already
been cancelled. So if there are only cancelled timers left it should
exit immediately.
---
cpp/src/container_test.cpp | 16 ++++++++++++++++
cpp/src/proactor_container_impl.cpp | 9 +++++++++
2 files changed, 25 insertions(+)
diff --git a/cpp/src/container_test.cpp b/cpp/src/container_test.cpp
index 09dffd5b2..4ac165bc6 100644
--- a/cpp/src/container_test.cpp
+++ b/cpp/src/container_test.cpp
@@ -332,6 +332,21 @@ int test_container_schedule_stop() {
return 0;
}
+struct cancel_schedule_tester : public proton::messaging_handler {
+ proton::work_handle timeout_handle;
+ void on_container_start(proton::container& c) override {
+ c.cancel(timeout_handle);
+ }
+};
+
+int test_container_cancel_schedule_autostop() {
+ cancel_schedule_tester tester;
+ proton::container c(tester);
+ tester.timeout_handle = c.schedule(proton::duration(10000), [&](){ c.stop(); });
+ c.run();
+ return 0;
+}
+
class link_test_handler : public proton::messaging_handler {//, public proton::listen_handler {
public:
bool had_receiver;
@@ -706,6 +721,7 @@ int main(int argc, char** argv) {
RUN_ARGV_TEST(failed, test_container_immediate_stop());
RUN_ARGV_TEST(failed, test_container_pre_stop());
RUN_ARGV_TEST(failed, test_container_schedule_stop());
+ RUN_ARGV_TEST(failed, test_container_cancel_schedule_autostop());
RUN_ARGV_TEST(failed, test_container_links_no_properties());
RUN_ARGV_TEST(failed, test_container_links_properties());
RUN_ARGV_TEST(failed, test_container_mt_stop_empty());
diff --git a/cpp/src/proactor_container_impl.cpp b/cpp/src/proactor_container_impl.cpp
index 228002e38..6489beaef 100644
--- a/cpp/src/proactor_container_impl.cpp
+++ b/cpp/src/proactor_container_impl.cpp
@@ -473,6 +473,10 @@ work_handle container::impl::schedule(duration delay, work f) {
void container::impl::cancel(work_handle work_handle) {
GUARD(deferred_lock_);
is_active_.erase(work_handle);
+ bool active_tasks = is_active_.size() > 0;
+ if (!active_tasks) {
+ pn_proactor_cancel_timeout(proactor_);
+ }
}
void container::impl::client_connection_options(const connection_options &opts) {
@@ -858,6 +862,11 @@ void container::impl::stop(const proton::error_condition& err) {
set_error_condition(err, error_condition);
pn_proactor_disconnect(proactor_, error_condition);
pn_condition_free(error_condition);
+ GUARD(deferred_lock_);
+ bool active_tasks = is_active_.size() > 0;
+ if (!active_tasks) {
+ pn_proactor_cancel_timeout(proactor_);
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org