From 06dd7edc6c6d56394be9feba131edfae176268ab Mon Sep 17 00:00:00 2001 From: Brad Werth Date: Tue, 8 Nov 2022 15:53:35 +0000 Subject: [PATCH] Bug 1798651 Part 2: Make WinWindowOcclusionTracker::ShutDown timeout after 2 seconds. r=gfx-reviewers,sotaro Differential Revision: https://phabricator.services.mozilla.com/D161195 --- widget/windows/WinWindowOcclusionTracker.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/widget/windows/WinWindowOcclusionTracker.cpp b/widget/windows/WinWindowOcclusionTracker.cpp index 1b20b700c082..9aa339ea2c6a 100644 --- a/widget/windows/WinWindowOcclusionTracker.cpp +++ b/widget/windows/WinWindowOcclusionTracker.cpp @@ -371,15 +371,22 @@ void WinWindowOcclusionTracker::ShutDown() { sTracker->Destroy(); + // Our shutdown task could hang. Since we're shutting down, + // that's not a critical problem. We set a reasonable amount + // of time to wait for shutdown, and if it succeeds within + // that time, we correctly stop our tracker thread. If it + // times out, we just leak the memory and proceed. + static const PRIntervalTime TIMEOUT = PR_TicksPerSecond() * 2; layers::SynchronousTask task("WinWindowOcclusionTracker"); RefPtr runnable = WrapRunnable(RefPtr( WindowOcclusionCalculator::GetInstance()), &WindowOcclusionCalculator::Shutdown, &task); OcclusionCalculatorLoop()->PostTask(runnable.forget()); - task.Wait(); - - sTracker->mThread->Stop(); + nsresult rv = task.Wait(TIMEOUT); + if (rv == NS_OK) { + sTracker->mThread->Stop(); + } WindowOcclusionCalculator::ClearInstance(); sTracker = nullptr;