From aceac8b6774a93cfa867ff12317b73a7ef21ddf5 Mon Sep 17 00:00:00 2001 From: Emiel Bruijntjes Date: Fri, 29 Aug 2014 13:18:08 +0200 Subject: [PATCH] the finalize callback is now called as part of the deferred object destructor, this ensures that the finalize callback will always be called --- include/deferred.h | 28 ++++++++++++++-------------- include/deferreddelete.h | 3 --- include/deferredqueue.h | 3 --- src/deferredcancel.cpp | 3 --- src/deferredconsumer.cpp | 3 --- src/deferredget.cpp | 9 +-------- 6 files changed, 15 insertions(+), 34 deletions(-) diff --git a/include/deferred.h b/include/deferred.h index 3d950cf..5edafec 100644 --- a/include/deferred.h +++ b/include/deferred.h @@ -22,6 +22,13 @@ class Callbacks; */ class Deferred { +private: + /** + * Callback to execute either way + * @var FinalizeCallback + */ + FinalizeCallback _finalizeCallback; + protected: /** * Callback to execute on success @@ -35,12 +42,6 @@ protected: */ ErrorCallback _errorCallback; - /** - * Callback to execute either way - * @var FinalizeCallback - */ - FinalizeCallback _finalizeCallback; - /** * Pointer to the next deferred object * @var Deferred @@ -70,8 +71,7 @@ protected: virtual Deferred *reportSuccess() const { // execute callbacks if registered - if (_successCallback) _successCallback(); - if (_finalizeCallback) _finalizeCallback(); + if (_successCallback) _successCallback(); // return the next deferred result return _next; @@ -123,8 +123,7 @@ protected: _failed = true; // execute callbacks if registered - if (_errorCallback) _errorCallback(error); - if (_finalizeCallback) _finalizeCallback(); + if (_errorCallback) _errorCallback(error); // return the next deferred result return _next; @@ -166,7 +165,11 @@ public: /** * Destructor */ - virtual ~Deferred() {} + virtual ~Deferred() + { + // report to the finalize callback + if (_finalizeCallback) _finalizeCallback(); + } /** * Cast to a boolean @@ -238,9 +241,6 @@ public: // store callback _finalizeCallback = callback; - // if the object is already in a failed state, we call the callback right away - if (_failed) callback(); - // allow chaining return *this; } diff --git a/include/deferreddelete.h b/include/deferreddelete.h index aa0d83e..d75614b 100644 --- a/include/deferreddelete.h +++ b/include/deferreddelete.h @@ -37,9 +37,6 @@ private: // call the callback _deleteCallback(messagecount); - // call finalize callback - if (_finalizeCallback) _finalizeCallback(); - // return next object return _next; } diff --git a/include/deferredqueue.h b/include/deferredqueue.h index 6b5d930..05878f0 100644 --- a/include/deferredqueue.h +++ b/include/deferredqueue.h @@ -38,9 +38,6 @@ private: // call the queue callback _queueCallback(name, messagecount, consumercount); - // call finalize callback - if (_finalizeCallback) _finalizeCallback(); - // return next object return _next; } diff --git a/src/deferredcancel.cpp b/src/deferredcancel.cpp index aaecebe..384ce9b 100644 --- a/src/deferredcancel.cpp +++ b/src/deferredcancel.cpp @@ -28,9 +28,6 @@ Deferred *DeferredCancel::reportSuccess(const std::string &name) const // call the callback _cancelCallback(name); - // call finalize callback - if (_finalizeCallback) _finalizeCallback(); - // return next object return _next; } diff --git a/src/deferredconsumer.cpp b/src/deferredconsumer.cpp index 528cbcb..63e3f1c 100644 --- a/src/deferredconsumer.cpp +++ b/src/deferredconsumer.cpp @@ -28,9 +28,6 @@ Deferred *DeferredConsumer::reportSuccess(const std::string &name) const // call the callback _consumeCallback(name); - // call finalize callback - if (_finalizeCallback) _finalizeCallback(); - // return next object return _next; } diff --git a/src/deferredget.cpp b/src/deferredget.cpp index 8daeaf6..0a551db 100644 --- a/src/deferredget.cpp +++ b/src/deferredget.cpp @@ -26,7 +26,6 @@ Deferred *DeferredGet::reportSuccess(uint32_t messageCount) const { // make copies of the callbacks auto messageCallback = _messageCallback; - auto finalizeCallback = _finalizeCallback; auto *channel = _channel; // install a monitor because the channel could be destructed @@ -36,7 +35,7 @@ Deferred *DeferredGet::reportSuccess(uint32_t messageCount) const if (_sizeCallback) _sizeCallback(messageCount); // we now know the name, so we can install the message callback on the channel - _channel->install("", [channel, messageCallback, finalizeCallback](const Message &message, uint64_t deliveryTag, bool redelivered) { + _channel->install("", [channel, messageCallback](const Message &message, uint64_t deliveryTag, bool redelivered) { // install a monitor to deal with the case that the channel is removed Monitor monitor(channel); @@ -44,9 +43,6 @@ Deferred *DeferredGet::reportSuccess(uint32_t messageCount) const // call the callbacks if (messageCallback) messageCallback(message, deliveryTag, redelivered); - // call the finalize callback - if (finalizeCallback) finalizeCallback(); - // we can remove the callback now from the channel if (monitor.valid()) channel->uninstall(""); }); @@ -66,9 +62,6 @@ Deferred *DeferredGet::reportSuccess() const // check if a callback was set if (_emptyCallback) _emptyCallback(); - // call finalize callback - if (_finalizeCallback) _finalizeCallback(); - // return next object return _next; }