Bug 1306529 - OmxDataDecoder: Fix a stall issue on shutting down r?jya draft
authorTakuro Ashie <ashie@clear-code.com>
Tue, 27 Mar 2018 16:37:21 +0900
changeset 784107 eab5f39bd504983b589541fa8038cffd7d53d004
parent 784106 1a5f4814afff3eeece6704ea2ca56c0190f0feca
push id106858
push userbmo:ashie@clear-code.com
push dateWed, 18 Apr 2018 05:30:01 +0000
reviewersjya
bugs1306529, 1319987
milestone61.0a1
Bug 1306529 - OmxDataDecoder: Fix a stall issue on shutting down r?jya Because the shutdown closure awaits finishing itself by TaskQueue::AwaitShutdownAndIdle(), the function blocks infinitely. The code is wrongly introduced at the following commit: * https://bugzilla.mozilla.org/show_bug.cgi?id=1319987 * https://hg.mozilla.org/mozilla-central/rev/b2171e3e8b69 This patch calls it on mTaskQueue intead of mOmxTaskQueue to avoid the issue. MozReview-Commit-ID: 4qmX2QlniEG
dom/media/platforms/omx/OmxDataDecoder.cpp
--- a/dom/media/platforms/omx/OmxDataDecoder.cpp
+++ b/dom/media/platforms/omx/OmxDataDecoder.cpp
@@ -268,35 +268,39 @@ OmxDataDecoder::DoAsyncShutdown()
 
              return p;
            },
            [self] (const OmxCommandFailureHolder& aError) {
              self->mOmxLayer->Shutdown();
              return OmxCommandPromise::CreateAndReject(aError, __func__);
            })
     ->Then(mOmxTaskQueue, __func__,
-           [self] () {
+           [self] () -> RefPtr<ShutdownPromise> {
              LOGL("DoAsyncShutdown: OMX_StateLoaded, it is safe to shutdown omx");
              self->mOmxLayer->Shutdown();
              self->mWatchManager.Shutdown();
              self->mOmxLayer = nullptr;
              self->mMediaDataHelper = nullptr;
-
              self->mShuttingDown = false;
+             return ShutdownPromise::CreateAndResolve(true, __func__);
+           },
+           [self] () -> RefPtr<ShutdownPromise> {
+             self->mOmxLayer->Shutdown();
+             self->mWatchManager.Shutdown();
+             self->mOmxLayer = nullptr;
+             self->mMediaDataHelper = nullptr;
+             return ShutdownPromise::CreateAndReject(false, __func__);
+           })
+    ->Then(mTaskQueue, __func__,
+           [self] () {
              self->mOmxTaskQueue->BeginShutdown();
              self->mOmxTaskQueue->AwaitShutdownAndIdle();
              self->mShutdownPromise.Resolve(true, __func__);
            },
            [self] () {
-             self->mOmxLayer->Shutdown();
-             self->mWatchManager.Shutdown();
-             self->mOmxLayer = nullptr;
-             self->mMediaDataHelper = nullptr;
-
-             self->mShuttingDown = false;
              self->mOmxTaskQueue->BeginShutdown();
              self->mOmxTaskQueue->AwaitShutdownAndIdle();
              self->mShutdownPromise.Resolve(true, __func__);
            });
   return mShutdownPromise.Ensure(__func__);
 }
 
 void