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

View File

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

View File

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

View File

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

View File

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

View File

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