From 3a6dcfcd03cef741edd6bdb68e136ef410d3df78 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Thu, 12 Apr 2018 22:52:32 +0200 Subject: [PATCH] logic: Fixed race condition in TooltipController --- .../controller/TooltipController.cpp | 55 ++++++++++++------- .../component/controller/TooltipController.h | 1 + 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/lib/component/controller/TooltipController.cpp b/src/lib/component/controller/TooltipController.cpp index 2c463f3e..e6948a3a 100644 --- a/src/lib/component/controller/TooltipController.cpp +++ b/src/lib/component/controller/TooltipController.cpp @@ -23,8 +23,12 @@ TooltipController::~TooltipController() void TooltipController::clear() { - m_showRequest.reset(); + { + std::lock_guard lock(m_showRequestMutex); + m_showRequest.reset(); + } m_hideRequest = false; + getView()->hideTooltip(true); } @@ -94,7 +98,10 @@ void TooltipController::handleMessage(MessageTooltipShow* message) { getView()->showTooltip(info, getViewForOrigin(message->origin)); - m_showRequest.reset(); + { + std::lock_guard lock(m_showRequestMutex); + m_showRequest.reset(); + } m_hideRequest = false; } } @@ -120,11 +127,15 @@ void TooltipController::requestTooltipShow(const std::vector tokenIds, Toolt { Id requestId = TooltipRequest::s_requestId++; - m_showRequest = std::make_unique(); - m_showRequest->requestId = requestId; - m_showRequest->tokenIds = tokenIds; - m_showRequest->info = info; - m_showRequest->origin = origin; + { + std::lock_guard lock(m_showRequestMutex); + + m_showRequest = std::make_unique(); + m_showRequest->requestId = requestId; + m_showRequest->tokenIds = tokenIds; + m_showRequest->info = info; + m_showRequest->origin = origin; + } size_t delayMS = 700; if (getView()->tooltipVisible()) @@ -136,22 +147,25 @@ void TooltipController::requestTooltipShow(const std::vector tokenIds, Toolt std::make_shared( [requestId, this]() { - if (m_showRequest && m_showRequest->requestId == requestId) + std::unique_ptr request; { - if (!m_showRequest->info.isValid() && m_showRequest->tokenIds.size()) + std::lock_guard lock(m_showRequestMutex); + if (!m_showRequest || m_showRequest->requestId != requestId) { - m_showRequest->info = m_storageAccess->getTooltipInfoForTokenIds( - m_showRequest->tokenIds, m_showRequest->origin); + return; } + request = std::move(m_showRequest); + } - TooltipView* view = getView(); - if (m_showRequest->info.isValid()) - { - view->showTooltip(m_showRequest->info, getViewForOrigin(m_showRequest->origin)); + if (!request->info.isValid() && request->tokenIds.size()) + { + request->info = m_storageAccess->getTooltipInfoForTokenIds(request->tokenIds, request->origin); + } - m_showRequest.reset(); - m_hideRequest = false; - } + if (request->info.isValid()) + { + getView()->showTooltip(request->info, getViewForOrigin(request->origin)); + m_hideRequest = false; } } ) @@ -160,7 +174,10 @@ void TooltipController::requestTooltipShow(const std::vector tokenIds, Toolt void TooltipController::requestTooltipHide() { - m_showRequest.reset(); + { + std::lock_guard lock(m_showRequestMutex); + m_showRequest.reset(); + } m_hideRequest = true; Task::dispatch(std::make_shared(500)->addChildTask( diff --git a/src/lib/component/controller/TooltipController.h b/src/lib/component/controller/TooltipController.h index 38c2be11..a13e5db7 100644 --- a/src/lib/component/controller/TooltipController.h +++ b/src/lib/component/controller/TooltipController.h @@ -70,6 +70,7 @@ private: StorageAccess* m_storageAccess; std::unique_ptr m_showRequest; + std::mutex m_showRequestMutex; bool m_hideRequest; };