Bug 1351053. P1 - add some assertions to debug who is holding the lock. r?jya draft
authorJW Wang <jwwang@mozilla.com>
Wed, 05 Apr 2017 16:25:56 +0800
changeset 556050 d99fcb89c4380f2fe50444ee073018a72a555611
parent 556049 62e20605fcbc60651e3bdadbb82576a703953f90
child 622773 9e0ea99a190b500b86c7a7726fcff4735d2f10c1
push id52421
push userjwwang@mozilla.com
push dateWed, 05 Apr 2017 09:00:13 +0000
reviewersjya
bugs1351053
milestone55.0a1
Bug 1351053. P1 - add some assertions to debug who is holding the lock. r?jya MozReview-Commit-ID: 6twXYbLm8Da
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -915,17 +915,17 @@ public:
     RefPtr<Wrapper> self = this;
     mTaskQueue->Dispatch(NS_NewRunnableFunction([self]() {
       self->mTrackDemuxer->Reset();
     }));
   }
 
   nsresult GetNextRandomAccessPoint(TimeUnit* aTime) override
   {
-    MutexAutoLock lock(mMutex);
+    AutoLock lock(this, __func__);
     if (NS_SUCCEEDED(mNextRandomAccessPointResult)) {
       *aTime = mNextRandomAccessPoint;
     }
     return mNextRandomAccessPointResult;
   }
 
   RefPtr<SkipAccessPointPromise>
   SkipToNextRandomAccessPoint(const media::TimeUnit& aTimeThreshold) override
@@ -939,62 +939,83 @@ public:
              })
       ->Then(mTaskQueue, __func__,
              [self]() { self->UpdateRandomAccessPoint(); },
              [self]() { self->UpdateRandomAccessPoint(); });
   }
 
   TimeIntervals GetBuffered() override
   {
-    MutexAutoLock lock(mMutex);
+    AutoLock lock(this, __func__);
     return mBuffered;
   }
 
   void BreakCycles() override { }
 
 private:
+  class AutoLock : public MutexAutoLock
+  {
+  public:
+    AutoLock(Wrapper* aThis, const char* aCallSite)
+      : MutexAutoLock(aThis->mMutex)
+      , mThis(aThis)
+    {
+      mThis->mCallSite = aCallSite;
+    }
+    ~AutoLock()
+    {
+      mThis->mCallSite = nullptr;
+    }
+  private:
+    Wrapper* const mThis;
+  };
+
   Mutex mMutex;
+  const char* mCallSite = nullptr;
   const RefPtr<AutoTaskQueue> mTaskQueue;
   const bool mGetSamplesMayBlock;
   const UniquePtr<TrackInfo> mInfo;
   // mTrackDemuxer is only ever accessed on demuxer's task queue.
   RefPtr<MediaTrackDemuxer> mTrackDemuxer;
   // All following members are protected by mMutex
   nsresult mNextRandomAccessPointResult = NS_OK;
   TimeUnit mNextRandomAccessPoint;
   TimeIntervals mBuffered;
   friend class DemuxerProxy;
 
   ~Wrapper()
   {
+    if (mCallSite != nullptr) {
+      MOZ_CRASH_UNSAFE_PRINTF("destroying a still-owned lock! callsite=%s", mCallSite);
+    }
     RefPtr<MediaTrackDemuxer> trackDemuxer = mTrackDemuxer.forget();
     mTaskQueue->Dispatch(NS_NewRunnableFunction(
       [trackDemuxer]() { trackDemuxer->BreakCycles(); }));
   }
 
   void UpdateRandomAccessPoint()
   {
     MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
     if (!mTrackDemuxer) {
       // Detached.
       return;
     }
-    MutexAutoLock lock(mMutex);
+    AutoLock lock(this, __func__);
     mNextRandomAccessPointResult =
       mTrackDemuxer->GetNextRandomAccessPoint(&mNextRandomAccessPoint);
   }
 
   void UpdateBuffered()
   {
     MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
     if (!mTrackDemuxer) {
       // Detached.
       return;
     }
-    MutexAutoLock lock(mMutex);
+    AutoLock lock(this, __func__);
     mBuffered = mTrackDemuxer->GetBuffered();
   }
 };
 
 RefPtr<MediaDataDemuxer::InitPromise>
 MediaFormatReader::DemuxerProxy::Init()
 {
   RefPtr<Data> data = mData;