Fixed JSON RPC handling during shutdown

This commit is contained in:
SChernykh
2022-07-05 14:29:41 +02:00
parent 340a3e85c8
commit 4ec0fe8d96
3 changed files with 54 additions and 9 deletions

View File

@@ -137,9 +137,12 @@ struct UV_LoopUserData
UV_LoopUserData* GetLoopUserData(uv_loop_t* loop, bool create = true);
template<typename T>
void CallOnLoop(uv_loop_t* loop, T&& callback)
bool CallOnLoop(uv_loop_t* loop, T&& callback)
{
UV_LoopUserData* data = GetLoopUserData(loop, false);
if (!data) {
return false;
}
UV_LoopCallbackBase* cb = new UV_LoopCallback<T>(std::move(callback));
{
@@ -147,7 +150,27 @@ void CallOnLoop(uv_loop_t* loop, T&& callback)
data->m_callbacks.push_back(cb);
}
uv_async_send(data->m_async);
if (uv_async_send(data->m_async) == 0) {
return true;
}
// Clean up after uv_async_send error
bool found = false;
{
MutexLock lock(data->m_callbacksLock);
auto it = std::find(data->m_callbacks.begin(), data->m_callbacks.end(), cb);
if (it != data->m_callbacks.end()) {
found = true;
data->m_callbacks.erase(it);
}
}
if (found) {
delete cb;
}
return false;
}
} // namespace p2pool