summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortommi <tommi@chromium.org>2014-11-06 03:01:24 -0800
committerCommit bot <commit-bot@chromium.org>2014-11-06 11:02:11 +0000
commitf74edd430ce04903dad5908b07b5bb36d4da749f (patch)
treec9bfd36c41fdc5108c2f6f47ccdcea6ab67e5dc4
parentad2f21668af6195ca662136305a029e0331c3d20 (diff)
downloadchromium_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.cc12
-rw-r--r--content/renderer/media/remote_media_stream_impl.h9
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,