diff options
author | tommi <tommi@chromium.org> | 2014-11-06 03:01:24 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-06 11:02:11 +0000 |
commit | f74edd430ce04903dad5908b07b5bb36d4da749f (patch) | |
tree | c9bfd36c41fdc5108c2f6f47ccdcea6ab67e5dc4 | |
parent | ad2f21668af6195ca662136305a029e0331c3d20 (diff) | |
download | chromium_src-f74edd430ce04903dad5908b07b5bb36d4da749f.zip chromium_src-f74edd430ce04903dad5908b07b5bb36d4da749f.tar.gz chromium_src-f74edd430ce04903dad5908b07b5bb36d4da749f.tar.bz2 |
Explicitly unregister from receiving notifications before releasing the webrtc mediastream observer.
BUG=430699
Review URL: https://codereview.chromium.org/703033004
Cr-Commit-Position: refs/heads/master@{#303006}
-rw-r--r-- | content/renderer/media/remote_media_stream_impl.cc | 12 | ||||
-rw-r--r-- | content/renderer/media/remote_media_stream_impl.h | 9 |
2 files changed, 17 insertions, 4 deletions
diff --git a/content/renderer/media/remote_media_stream_impl.cc b/content/renderer/media/remote_media_stream_impl.cc index 057c104..06f4177 100644 --- a/content/renderer/media/remote_media_stream_impl.cc +++ b/content/renderer/media/remote_media_stream_impl.cc @@ -328,8 +328,7 @@ RemoteMediaStreamImpl::Observer::Observer( } RemoteMediaStreamImpl::Observer::~Observer() { - DCHECK(ctor_thread_.CalledOnValidThread()); - webrtc_stream_->UnregisterObserver(this); + DCHECK(!webrtc_stream_.get()) << "Unregister hasn't been called"; } void RemoteMediaStreamImpl::Observer::InitializeOnMainThread( @@ -339,6 +338,14 @@ void RemoteMediaStreamImpl::Observer::InitializeOnMainThread( media_stream_->InitializeOnMainThread(label); } +void RemoteMediaStreamImpl::Observer::Unregister() { + DCHECK(main_thread_->BelongsToCurrentThread()); + webrtc_stream_->UnregisterObserver(this); + // Since we're guaranteed to not get further notifications, it's safe to + // release the webrtc_stream_ here. + webrtc_stream_ = nullptr; +} + void RemoteMediaStreamImpl::Observer::OnChanged() { scoped_ptr<RemoteAudioTrackAdapters> audio(new RemoteAudioTrackAdapters()); scoped_ptr<RemoteVideoTrackAdapters> video(new RemoteVideoTrackAdapters()); @@ -383,6 +390,7 @@ RemoteMediaStreamImpl::~RemoteMediaStreamImpl() { DCHECK(observer_->main_thread()->BelongsToCurrentThread()); for (auto& track : audio_track_observers_) track->Unregister(); + observer_->Unregister(); } void RemoteMediaStreamImpl::InitializeOnMainThread(const std::string& label) { diff --git a/content/renderer/media/remote_media_stream_impl.h b/content/renderer/media/remote_media_stream_impl.h index 683804a..0c230ba 100644 --- a/content/renderer/media/remote_media_stream_impl.h +++ b/content/renderer/media/remote_media_stream_impl.h @@ -65,6 +65,12 @@ class CONTENT_EXPORT RemoteMediaStreamImpl { void InitializeOnMainThread(const std::string& label); + // Uninitializes the observer, unregisteres from receiving notifications + // and releases the webrtc stream. + // Note: Must be called from the main thread before releasing the main + // reference. + void Unregister(); + private: friend class base::RefCountedThreadSafe<Observer>; ~Observer() override; @@ -78,8 +84,7 @@ class CONTENT_EXPORT RemoteMediaStreamImpl { base::WeakPtr<RemoteMediaStreamImpl> media_stream_; const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; - const scoped_refptr<webrtc::MediaStreamInterface> webrtc_stream_; - base::ThreadChecker ctor_thread_; + scoped_refptr<webrtc::MediaStreamInterface> webrtc_stream_; }; void OnChanged(scoped_ptr<RemoteAudioTrackAdapters> audio_tracks, |