the finalize callback is now called as part of the deferred object destructor, this ensures that the finalize callback will always be called

This commit is contained in:
Emiel Bruijntjes 2014-08-29 13:18:08 +02:00
parent d35dba71a1
commit aceac8b677
6 changed files with 15 additions and 34 deletions

View File

@ -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;
}

View File

@ -37,9 +37,6 @@ private:
// call the callback
_deleteCallback(messagecount);
// call finalize callback
if (_finalizeCallback) _finalizeCallback();
// return next object
return _next;
}

View File

@ -38,9 +38,6 @@ private:
// call the queue callback
_queueCallback(name, messagecount, consumercount);
// call finalize callback
if (_finalizeCallback) _finalizeCallback();
// return next object
return _next;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}