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
|
class Deferred
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Callback to execute either way
|
||||||
|
* @var FinalizeCallback
|
||||||
|
*/
|
||||||
|
FinalizeCallback _finalizeCallback;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Callback to execute on success
|
* Callback to execute on success
|
||||||
|
|
@ -35,12 +42,6 @@ protected:
|
||||||
*/
|
*/
|
||||||
ErrorCallback _errorCallback;
|
ErrorCallback _errorCallback;
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback to execute either way
|
|
||||||
* @var FinalizeCallback
|
|
||||||
*/
|
|
||||||
FinalizeCallback _finalizeCallback;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pointer to the next deferred object
|
* Pointer to the next deferred object
|
||||||
* @var Deferred
|
* @var Deferred
|
||||||
|
|
@ -70,8 +71,7 @@ protected:
|
||||||
virtual Deferred *reportSuccess() const
|
virtual Deferred *reportSuccess() const
|
||||||
{
|
{
|
||||||
// execute callbacks if registered
|
// execute callbacks if registered
|
||||||
if (_successCallback) _successCallback();
|
if (_successCallback) _successCallback();
|
||||||
if (_finalizeCallback) _finalizeCallback();
|
|
||||||
|
|
||||||
// return the next deferred result
|
// return the next deferred result
|
||||||
return _next;
|
return _next;
|
||||||
|
|
@ -123,8 +123,7 @@ protected:
|
||||||
_failed = true;
|
_failed = true;
|
||||||
|
|
||||||
// execute callbacks if registered
|
// execute callbacks if registered
|
||||||
if (_errorCallback) _errorCallback(error);
|
if (_errorCallback) _errorCallback(error);
|
||||||
if (_finalizeCallback) _finalizeCallback();
|
|
||||||
|
|
||||||
// return the next deferred result
|
// return the next deferred result
|
||||||
return _next;
|
return _next;
|
||||||
|
|
@ -166,7 +165,11 @@ public:
|
||||||
/**
|
/**
|
||||||
* Destructor
|
* Destructor
|
||||||
*/
|
*/
|
||||||
virtual ~Deferred() {}
|
virtual ~Deferred()
|
||||||
|
{
|
||||||
|
// report to the finalize callback
|
||||||
|
if (_finalizeCallback) _finalizeCallback();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast to a boolean
|
* Cast to a boolean
|
||||||
|
|
@ -238,9 +241,6 @@ public:
|
||||||
// store callback
|
// store callback
|
||||||
_finalizeCallback = callback;
|
_finalizeCallback = callback;
|
||||||
|
|
||||||
// if the object is already in a failed state, we call the callback right away
|
|
||||||
if (_failed) callback();
|
|
||||||
|
|
||||||
// allow chaining
|
// allow chaining
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,6 @@ private:
|
||||||
// call the callback
|
// call the callback
|
||||||
_deleteCallback(messagecount);
|
_deleteCallback(messagecount);
|
||||||
|
|
||||||
// call finalize callback
|
|
||||||
if (_finalizeCallback) _finalizeCallback();
|
|
||||||
|
|
||||||
// return next object
|
// return next object
|
||||||
return _next;
|
return _next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,9 +38,6 @@ private:
|
||||||
// call the queue callback
|
// call the queue callback
|
||||||
_queueCallback(name, messagecount, consumercount);
|
_queueCallback(name, messagecount, consumercount);
|
||||||
|
|
||||||
// call finalize callback
|
|
||||||
if (_finalizeCallback) _finalizeCallback();
|
|
||||||
|
|
||||||
// return next object
|
// return next object
|
||||||
return _next;
|
return _next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,6 @@ Deferred *DeferredCancel::reportSuccess(const std::string &name) const
|
||||||
// call the callback
|
// call the callback
|
||||||
_cancelCallback(name);
|
_cancelCallback(name);
|
||||||
|
|
||||||
// call finalize callback
|
|
||||||
if (_finalizeCallback) _finalizeCallback();
|
|
||||||
|
|
||||||
// return next object
|
// return next object
|
||||||
return _next;
|
return _next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,6 @@ Deferred *DeferredConsumer::reportSuccess(const std::string &name) const
|
||||||
// call the callback
|
// call the callback
|
||||||
_consumeCallback(name);
|
_consumeCallback(name);
|
||||||
|
|
||||||
// call finalize callback
|
|
||||||
if (_finalizeCallback) _finalizeCallback();
|
|
||||||
|
|
||||||
// return next object
|
// return next object
|
||||||
return _next;
|
return _next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,6 @@ Deferred *DeferredGet::reportSuccess(uint32_t messageCount) const
|
||||||
{
|
{
|
||||||
// make copies of the callbacks
|
// make copies of the callbacks
|
||||||
auto messageCallback = _messageCallback;
|
auto messageCallback = _messageCallback;
|
||||||
auto finalizeCallback = _finalizeCallback;
|
|
||||||
auto *channel = _channel;
|
auto *channel = _channel;
|
||||||
|
|
||||||
// install a monitor because the channel could be destructed
|
// install a monitor because the channel could be destructed
|
||||||
|
|
@ -36,7 +35,7 @@ Deferred *DeferredGet::reportSuccess(uint32_t messageCount) const
|
||||||
if (_sizeCallback) _sizeCallback(messageCount);
|
if (_sizeCallback) _sizeCallback(messageCount);
|
||||||
|
|
||||||
// we now know the name, so we can install the message callback on the channel
|
// 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
|
// install a monitor to deal with the case that the channel is removed
|
||||||
Monitor monitor(channel);
|
Monitor monitor(channel);
|
||||||
|
|
@ -44,9 +43,6 @@ Deferred *DeferredGet::reportSuccess(uint32_t messageCount) const
|
||||||
// call the callbacks
|
// call the callbacks
|
||||||
if (messageCallback) messageCallback(message, deliveryTag, redelivered);
|
if (messageCallback) messageCallback(message, deliveryTag, redelivered);
|
||||||
|
|
||||||
// call the finalize callback
|
|
||||||
if (finalizeCallback) finalizeCallback();
|
|
||||||
|
|
||||||
// we can remove the callback now from the channel
|
// we can remove the callback now from the channel
|
||||||
if (monitor.valid()) channel->uninstall("");
|
if (monitor.valid()) channel->uninstall("");
|
||||||
});
|
});
|
||||||
|
|
@ -66,9 +62,6 @@ Deferred *DeferredGet::reportSuccess() const
|
||||||
// check if a callback was set
|
// check if a callback was set
|
||||||
if (_emptyCallback) _emptyCallback();
|
if (_emptyCallback) _emptyCallback();
|
||||||
|
|
||||||
// call finalize callback
|
|
||||||
if (_finalizeCallback) _finalizeCallback();
|
|
||||||
|
|
||||||
// return next object
|
// return next object
|
||||||
return _next;
|
return _next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue