From e52397fb6365776a7f404edc0a06c9e94cfb307a Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 28 Jul 2020 09:21:07 -0700 Subject: [PATCH] Operation::cancel() return true if cancelled --- src/clientget.cpp | 12 ++++++++---- src/clientintrospect.cpp | 12 ++++++++---- src/clientmon.cpp | 12 ++++++++---- src/pvxs/client.h | 5 +++-- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/clientget.cpp b/src/clientget.cpp index eb6b864..51d9438 100644 --- a/src/clientget.cpp +++ b/src/clientget.cpp @@ -162,19 +162,21 @@ struct GPROp : public OperationBase } } - virtual void cancel() override final + virtual bool cancel() override final { auto context = chan->context; decltype (done) junk; - context->tcp_loop.call([this, &junk](){ - _cancel(false); + bool ret; + context->tcp_loop.call([this, &junk, &ret](){ + ret = _cancel(false); junk = std::move(done); // leave opByIOID for GC }); + return ret; } - void _cancel(bool implicit) { + bool _cancel(bool implicit) { if(implicit && state!=Done) { log_warn_printf(setup, "implied cancel of op%x on channel '%s'\n", op, chan ? chan->name.c_str() : ""); @@ -186,7 +188,9 @@ struct GPROp : public OperationBase chan->conn->opByIOID.erase(ioid); chan->opByIOID.erase(ioid); } + bool ret = state!=Done; state = Done; + return ret; } virtual void createOp() override final diff --git a/src/clientintrospect.cpp b/src/clientintrospect.cpp index 8c43007..0e30179 100644 --- a/src/clientintrospect.cpp +++ b/src/clientintrospect.cpp @@ -40,17 +40,19 @@ struct InfoOp : public OperationBase _cancel(true); } - virtual void cancel() override final { + virtual bool cancel() override final { auto context = chan->context; decltype (done) junk; - context->tcp_loop.call([this, &junk](){ - _cancel(false); + bool ret = false; + context->tcp_loop.call([this, &junk, &ret](){ + ret = _cancel(false); junk = std::move(done); // leave opByIOID for GC }); + return ret; } - void _cancel(bool implicit) { + bool _cancel(bool implicit) { if(implicit && state!=Done) { log_warn_printf(setup, "implied cancel of INFO on channel '%s'\n", chan ? chan->name.c_str() : ""); @@ -62,7 +64,9 @@ struct InfoOp : public OperationBase chan->conn->opByIOID.erase(ioid); chan->opByIOID.erase(ioid); } + bool ret = state!=Done; state = Done; + return ret; } virtual void createOp() override final diff --git a/src/clientmon.cpp b/src/clientmon.cpp index da86d85..0096ae6 100644 --- a/src/clientmon.cpp +++ b/src/clientmon.cpp @@ -162,17 +162,19 @@ struct SubscriptionImpl : public OperationBase, public Subscription return ret; } - virtual void cancel() override final { + virtual bool cancel() override final { auto context = chan->context; decltype (event) junk; - context->tcp_loop.call([this, &junk](){ - _cancel(false); + bool ret; + context->tcp_loop.call([this, &junk, &ret](){ + ret = _cancel(false); junk = std::move(event); // leave opByIOID for GC }); + return ret; } - void _cancel(bool implicit) { + bool _cancel(bool implicit) { if(implicit && state!=Done) { log_info_printf(io, "Server %s channel %s monitor implied cancel\n", chan->conn ? chan->conn->peerName.c_str() : "", @@ -192,7 +194,9 @@ struct SubscriptionImpl : public OperationBase, public Subscription if(pipeline) (void)event_del(ackTick.get()); } + bool ret = state!=Done; state = Done; + return ret; } virtual void createOp() override final diff --git a/src/pvxs/client.h b/src/pvxs/client.h index b23496f..2c4b165 100644 --- a/src/pvxs/client.h +++ b/src/pvxs/client.h @@ -117,7 +117,8 @@ struct PVXS_API Operation { //! Explicitly cancel a pending operation. //! Blocks until an in-progress callback has completed. - virtual void cancel() =0; + //! @returns true if the operation was cancelled, or false if already complete. + virtual bool cancel() =0; /** @brief Block until Operation completion * @@ -147,7 +148,7 @@ struct PVXS_API Subscription { //! Explicitly cancel a active subscription. //! Blocks until any in-progress callback has completed. - virtual void cancel() =0; + virtual bool cancel() =0; //! Ask a server to stop sending updates to this Subscription virtual void pause(bool p=true) =0;