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:
parent
d35dba71a1
commit
aceac8b677
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,9 +37,6 @@ private:
|
|||
// call the callback
|
||||
_deleteCallback(messagecount);
|
||||
|
||||
// call finalize callback
|
||||
if (_finalizeCallback) _finalizeCallback();
|
||||
|
||||
// return next object
|
||||
return _next;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,9 +38,6 @@ private:
|
|||
// call the queue callback
|
||||
_queueCallback(name, messagecount, consumercount);
|
||||
|
||||
// call finalize callback
|
||||
if (_finalizeCallback) _finalizeCallback();
|
||||
|
||||
// return next object
|
||||
return _next;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue