levin: armour against some "should not happen" case

If adding a response handler after the protocol is released,
they could never be cancelled again, and would end up keeping
a ref that never goes away
This commit is contained in:
moneromooo-monero 2019-09-12 12:29:47 +00:00
parent d0d76f771a
commit e48dcb7a01
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
1 changed files with 5 additions and 0 deletions

View File

@ -272,6 +272,11 @@ public:
bool add_invoke_response_handler(const callback_t &cb, uint64_t timeout, async_protocol_handler& con, int command) bool add_invoke_response_handler(const callback_t &cb, uint64_t timeout, async_protocol_handler& con, int command)
{ {
CRITICAL_REGION_LOCAL(m_invoke_response_handlers_lock); CRITICAL_REGION_LOCAL(m_invoke_response_handlers_lock);
if (m_protocol_released)
{
MERROR("Adding response handler to a released object");
return false;
}
boost::shared_ptr<invoke_response_handler_base> handler(boost::make_shared<anvoke_handler<callback_t>>(cb, timeout, con, command)); boost::shared_ptr<invoke_response_handler_base> handler(boost::make_shared<anvoke_handler<callback_t>>(cb, timeout, con, command));
m_invoke_response_handlers.push_back(handler); m_invoke_response_handlers.push_back(handler);
return handler->is_timer_started(); return handler->is_timer_started();