From d852758b7b8322b6803d2edaff3af9c1fd9fe2b8 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sat, 4 Apr 2020 06:46:11 -0700 Subject: [PATCH] client: ensure worker is joined on close() --- src/client.cpp | 5 +++++ src/evhelper.cpp | 10 ++++++++++ src/evhelper.h | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/client.cpp b/src/client.cpp index 8ae162e..17bdbf2 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -378,6 +378,11 @@ void Context::Pvt::close() conn->cleanup(); } }); + + tcp_loop.join(); + + // ensure any in-progress callbacks have completed + manager.sync(); } void Context::Pvt::poke() diff --git a/src/evhelper.cpp b/src/evhelper.cpp index 48f9518..8683a58 100644 --- a/src/evhelper.cpp +++ b/src/evhelper.cpp @@ -99,6 +99,11 @@ struct evbase::Pvt : public epicsThreadRunable } virtual ~Pvt() { + join(); + } + + void join() + { if(event_base_loopexit(base.get(), nullptr)) log_crit_printf(logerr, "evbase error while interrupting loop for %p\n", base.get()); worker.exitWait(); @@ -189,6 +194,11 @@ evbase::evbase(const std::string &name, unsigned prio) evbase::~evbase() {} +void evbase::join() +{ + pvt->join(); +} + void evbase::sync() { call([](){}); diff --git a/src/evhelper.h b/src/evhelper.h index 2c2a91a..95f874a 100644 --- a/src/evhelper.h +++ b/src/evhelper.h @@ -62,7 +62,7 @@ struct owned_ptr : public std::unique_ptr struct PVXS_API evbase { explicit evbase(const std::string& name, unsigned prio=0); ~evbase(); - void start(); + void join(); void sync();