From ce80e8897bdc0df37423667d0caa521faa51b61f Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 23 Jul 2020 12:21:16 -0700 Subject: [PATCH] Pass SharedPV& to onFirstConnect()/onLastDisconnect() For consistency among the on*() callbacks. --- src/pvxs/sharedpv.h | 4 ++-- src/sharedpv.cpp | 16 ++++++++++------ test/testget.cpp | 4 ++-- test/testinfo.cpp | 4 ++-- test/testput.cpp | 4 ++-- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/pvxs/sharedpv.h b/src/pvxs/sharedpv.h index f3b8152..d1d24f1 100644 --- a/src/pvxs/sharedpv.h +++ b/src/pvxs/sharedpv.h @@ -52,9 +52,9 @@ struct PVXS_API SharedPV void attach(std::unique_ptr&& op); //! Callback when the number of attach()d clients becomes non-zero. - void onFirstConnect(std::function&& fn); + void onFirstConnect(std::function&& fn); //! Callback when the number of attach()d clients becomes zero. - void onLastDisconnect(std::function&& fn); + void onLastDisconnect(std::function&& fn); //! Callback when a client executes a new Put operation. void onPut(std::function&&, Value&&)>&& fn); //! Callback when a client executes an RPC operation. diff --git a/src/sharedpv.cpp b/src/sharedpv.cpp index b46c1c0..8ee79aa 100644 --- a/src/sharedpv.cpp +++ b/src/sharedpv.cpp @@ -36,8 +36,8 @@ struct SharedPV::Impl : public std::enable_shared_from_this std::function&&, Value&&)> onPut; std::function&&, Value&&)> onRPC; - std::function onFirstConnect; - std::function onLastDisconnect; + std::function onFirstConnect; + std::function onLastDisconnect; ptr_set> channels; @@ -244,7 +244,9 @@ void SharedPV::attach(std::unique_ptr&& ctrlop) if(self->channels.empty() && self->onLastDisconnect) { auto cb(self->onLastDisconnect); UnGuard U(G); - cb(); + SharedPV pv; + pv.impl = self; + cb(pv); } }); @@ -259,11 +261,13 @@ void SharedPV::attach(std::unique_ptr&& ctrlop) if(first && self->onFirstConnect) { auto cb(self->onFirstConnect); UnGuard U(G); - cb(); + SharedPV pv; + pv.impl = self; + cb(pv); } } -void SharedPV::onFirstConnect(std::function&& fn) +void SharedPV::onFirstConnect(std::function&& fn) { if(!impl) throw std::logic_error("Empty SharedPV"); @@ -271,7 +275,7 @@ void SharedPV::onFirstConnect(std::function&& fn) impl->onFirstConnect = std::move(fn); } -void SharedPV::onLastDisconnect(std::function&& fn) +void SharedPV::onLastDisconnect(std::function&& fn) { if(!impl) throw std::logic_error("Empty SharedPV"); diff --git a/test/testget.cpp b/test/testget.cpp index 1b8771f..a1e0112 100644 --- a/test/testget.cpp +++ b/test/testget.cpp @@ -106,13 +106,13 @@ struct Tester { std::atomic onFC{false}, onLD{false}; epicsEvent done; - mbox.onFirstConnect([this, &onFC](){ + mbox.onFirstConnect([this, &onFC](server::SharedPV&){ testShow()<<"In onFirstConnect()"; mbox.open(initial); onFC.store(true); }); - mbox.onLastDisconnect([this, &onLD, &done](){ + mbox.onLastDisconnect([this, &onLD, &done](server::SharedPV&){ testShow()<<"In onLastDisconnect"; mbox.close(); onLD.store(true); diff --git a/test/testinfo.cpp b/test/testinfo.cpp index ce104eb..3e873ea 100644 --- a/test/testinfo.cpp +++ b/test/testinfo.cpp @@ -82,13 +82,13 @@ struct Tester { std::atomic onFC{false}, onLD{false}; epicsEvent done; - mbox.onFirstConnect([this, &onFC](){ + mbox.onFirstConnect([this, &onFC](server::SharedPV&){ testShow()<<"In onFirstConnect()"; mbox.open(initial); onFC.store(true); }); - mbox.onLastDisconnect([this, &onLD, &done](){ + mbox.onLastDisconnect([this, &onLD, &done](server::SharedPV&){ testShow()<<"In onLastDisconnect"; mbox.close(); onLD.store(true); diff --git a/test/testput.cpp b/test/testput.cpp index 1823fff..c68dcd9 100644 --- a/test/testput.cpp +++ b/test/testput.cpp @@ -107,13 +107,13 @@ struct Tester : public TesterBase std::atomic onFC{false}, onLD{false}; epicsEvent done; - mbox.onFirstConnect([this, &onFC](){ + mbox.onFirstConnect([this, &onFC](server::SharedPV&){ testShow()<<"In onFirstConnect()"; mbox.open(initial); onFC.store(true); }); - mbox.onLastDisconnect([this, &onLD, &done](){ + mbox.onLastDisconnect([this, &onLD, &done](server::SharedPV&){ testShow()<<"In onLastDisconnect"; mbox.close(); onLD.store(true);