[WinCairo][MediaFoundation] The main thread can sometimes be blocked forever when...
authorpeavo@outlook.com <peavo@outlook.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Nov 2015 18:24:57 +0000 (18:24 +0000)
committerpeavo@outlook.com <peavo@outlook.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Nov 2015 18:24:57 +0000 (18:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151387

Reviewed by Alex Christensen.

This happens because the main thread is waiting for the sample scheduler thread to finish,
but sometimes it never does. This can be resolved by emptying the scheduler's sample queue
before requesting the scheduler thread to finish. This will make sure the scheduler thread
returns to its main loop quickly, and can handle the termination request.

* platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp:
(WebCore::MediaPlayerPrivateMediaFoundation::VideoScheduler::stopScheduler):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@192578 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp

index 143609c..34a3bfb 100644 (file)
@@ -1,3 +1,18 @@
+2015-11-18  Per Arne Vollan  <peavo@outlook.com>
+
+        [WinCairo][MediaFoundation] The main thread can sometimes be blocked forever when ending a media session.
+        https://bugs.webkit.org/show_bug.cgi?id=151387
+
+        Reviewed by Alex Christensen.
+
+        This happens because the main thread is waiting for the sample scheduler thread to finish,
+        but sometimes it never does. This can be resolved by emptying the scheduler's sample queue
+        before requesting the scheduler thread to finish. This will make sure the scheduler thread
+        returns to its main loop quickly, and can handle the termination request.
+
+        * platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp:
+        (WebCore::MediaPlayerPrivateMediaFoundation::VideoScheduler::stopScheduler):
+
 2015-11-18  Adam Bergkvist  <adam.bergkvist@ericsson.com>
 
         WebRTC: Initial testing of updated RTCPeerConnection API
index f24fa65..831ee10 100644 (file)
@@ -2188,6 +2188,13 @@ HRESULT MediaPlayerPrivateMediaFoundation::VideoScheduler::stopScheduler()
     if (!m_schedulerThread.isValid())
         return S_OK;
 
+    {
+        // Clearing the sample queue before we post the thread terminate message will make sure
+        // the thread exits quickly, and we will not be stuck waiting for it to finish.
+        LockHolder locker(m_lock);
+        m_scheduledSamples.clear();
+    }
+
     // Terminate the scheduler thread
     ::PostThreadMessage(m_threadID, EventTerminate, 0, 0);
 
@@ -2199,9 +2206,6 @@ HRESULT MediaPlayerPrivateMediaFoundation::VideoScheduler::stopScheduler()
     m_schedulerThread.clear();
     m_flushEvent.clear();
 
-    // Throw away samples
-    m_scheduledSamples.clear();
-
     // Clear previously set timer resolution.
     timeEndPeriod(1);