logic: Fixed race condition in TooltipController
This commit is contained in:
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user