logic: Fixed race condition in TooltipController

This commit is contained in:
Eberhard Graether
2018-04-12 22:52:32 +02:00
parent a18aa0b9a6
commit 3a6dcfcd03
2 changed files with 37 additions and 19 deletions
@@ -23,8 +23,12 @@ TooltipController::~TooltipController()
void TooltipController::clear() void TooltipController::clear()
{ {
m_showRequest.reset(); {
std::lock_guard<std::mutex> lock(m_showRequestMutex);
m_showRequest.reset();
}
m_hideRequest = false; m_hideRequest = false;
getView()->hideTooltip(true); getView()->hideTooltip(true);
} }
@@ -94,7 +98,10 @@ void TooltipController::handleMessage(MessageTooltipShow* message)
{ {
getView()->showTooltip(info, getViewForOrigin(message->origin)); getView()->showTooltip(info, getViewForOrigin(message->origin));
m_showRequest.reset(); {
std::lock_guard<std::mutex> lock(m_showRequestMutex);
m_showRequest.reset();
}
m_hideRequest = false; m_hideRequest = false;
} }
} }
@@ -120,11 +127,15 @@ void TooltipController::requestTooltipShow(const std::vector<Id> tokenIds, Toolt
{ {
Id requestId = TooltipRequest::s_requestId++; Id requestId = TooltipRequest::s_requestId++;
m_showRequest = std::make_unique<TooltipRequest>(); {
m_showRequest->requestId = requestId; std::lock_guard<std::mutex> lock(m_showRequestMutex);
m_showRequest->tokenIds = tokenIds;
m_showRequest->info = info; m_showRequest = std::make_unique<TooltipRequest>();
m_showRequest->origin = origin; m_showRequest->requestId = requestId;
m_showRequest->tokenIds = tokenIds;
m_showRequest->info = info;
m_showRequest->origin = origin;
}
size_t delayMS = 700; size_t delayMS = 700;
if (getView()->tooltipVisible()) if (getView()->tooltipVisible())
@@ -136,22 +147,25 @@ void TooltipController::requestTooltipShow(const std::vector<Id> tokenIds, Toolt
std::make_shared<TaskLambda>( std::make_shared<TaskLambda>(
[requestId, this]() [requestId, this]()
{ {
if (m_showRequest && m_showRequest->requestId == requestId) std::unique_ptr<TooltipRequest> request;
{ {
if (!m_showRequest->info.isValid() && m_showRequest->tokenIds.size()) std::lock_guard<std::mutex> lock(m_showRequestMutex);
if (!m_showRequest || m_showRequest->requestId != requestId)
{ {
m_showRequest->info = m_storageAccess->getTooltipInfoForTokenIds( return;
m_showRequest->tokenIds, m_showRequest->origin);
} }
request = std::move(m_showRequest);
}
TooltipView* view = getView(); if (!request->info.isValid() && request->tokenIds.size())
if (m_showRequest->info.isValid()) {
{ request->info = m_storageAccess->getTooltipInfoForTokenIds(request->tokenIds, request->origin);
view->showTooltip(m_showRequest->info, getViewForOrigin(m_showRequest->origin)); }
m_showRequest.reset(); if (request->info.isValid())
m_hideRequest = false; {
} getView()->showTooltip(request->info, getViewForOrigin(request->origin));
m_hideRequest = false;
} }
} }
) )
@@ -160,7 +174,10 @@ void TooltipController::requestTooltipShow(const std::vector<Id> tokenIds, Toolt
void TooltipController::requestTooltipHide() void TooltipController::requestTooltipHide()
{ {
m_showRequest.reset(); {
std::lock_guard<std::mutex> lock(m_showRequestMutex);
m_showRequest.reset();
}
m_hideRequest = true; m_hideRequest = true;
Task::dispatch(std::make_shared<TaskDecoratorDelay>(500)->addChildTask( Task::dispatch(std::make_shared<TaskDecoratorDelay>(500)->addChildTask(
@@ -70,6 +70,7 @@ private:
StorageAccess* m_storageAccess; StorageAccess* m_storageAccess;
std::unique_ptr<TooltipRequest> m_showRequest; std::unique_ptr<TooltipRequest> m_showRequest;
std::mutex m_showRequestMutex;
bool m_hideRequest; bool m_hideRequest;
}; };