Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Unified Diff: media/base/pipeline.cc

Issue 423073012: Pipeline: Use WeakPtr for DemuxerHost Calls and Tasks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: drop weak_this_for_demuxer_ Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | media/base/pipeline_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/pipeline.cc
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
index 91ac2cfa139d4399957659ae9943771ed4d7a7e9..c1446828394c60a725fc2c33700d2270e7a5e05f 100644
--- a/media/base/pipeline.cc
+++ b/media/base/pipeline.cc
@@ -72,12 +72,6 @@ Pipeline::~Pipeline() {
media_log_->CreateEvent(MediaLogEvent::PIPELINE_DESTROYED));
}
-// The base::Unretained(this) in these functions are safe because:
-// 1, No public methods (except for the dtor) should be called after Stop().
-// 2, |this| will not be destructed until the stop callback is fired.
-// 3, Stop() also posts StopTask(), hence all XxxTask() will be executed before
-// StopTask(), and therefore before the dtor.
-
void Pipeline::Start(scoped_ptr<FilterCollection> collection,
const base::Closure& ended_cb,
const PipelineStatusCB& error_cb,
@@ -104,14 +98,14 @@ void Pipeline::Start(scoped_ptr<FilterCollection> collection,
duration_change_cb_ = duration_change_cb;
task_runner_->PostTask(
- FROM_HERE, base::Bind(&Pipeline::StartTask, base::Unretained(this)));
+ FROM_HERE, base::Bind(&Pipeline::StartTask, weak_factory_.GetWeakPtr()));
}
void Pipeline::Stop(const base::Closure& stop_cb) {
DVLOG(2) << __FUNCTION__;
task_runner_->PostTask(
FROM_HERE,
- base::Bind(&Pipeline::StopTask, base::Unretained(this), stop_cb));
+ base::Bind(&Pipeline::StopTask, weak_factory_.GetWeakPtr(), stop_cb));
}
void Pipeline::Seek(TimeDelta time, const PipelineStatusCB& seek_cb) {
@@ -123,7 +117,8 @@ void Pipeline::Seek(TimeDelta time, const PipelineStatusCB& seek_cb) {
task_runner_->PostTask(
FROM_HERE,
- base::Bind(&Pipeline::SeekTask, base::Unretained(this), time, seek_cb));
+ base::Bind(
+ &Pipeline::SeekTask, weak_factory_.GetWeakPtr(), time, seek_cb));
}
bool Pipeline::IsRunning() const {
@@ -145,7 +140,7 @@ void Pipeline::SetPlaybackRate(float playback_rate) {
if (running_) {
task_runner_->PostTask(FROM_HERE,
base::Bind(&Pipeline::PlaybackRateChangedTask,
- base::Unretained(this),
+ weak_factory_.GetWeakPtr(),
playback_rate));
}
}
@@ -165,7 +160,7 @@ void Pipeline::SetVolume(float volume) {
task_runner_->PostTask(
FROM_HERE,
base::Bind(
- &Pipeline::VolumeChangedTask, base::Unretained(this), volume));
+ &Pipeline::VolumeChangedTask, weak_factory_.GetWeakPtr(), volume));
}
}
@@ -269,16 +264,10 @@ Pipeline::State Pipeline::GetNextState() const {
return state_;
}
-// The use of base::Unretained(this) in the following 3 functions is safe
-// because these functions are called by the Demuxer directly, before the stop
-// callback is posted by the Demuxer. So the posted tasks will always be
-// executed before the stop callback is executed, and hence before the Pipeline
-// is destructed.
-
void Pipeline::OnDemuxerError(PipelineStatus error) {
task_runner_->PostTask(FROM_HERE,
base::Bind(&Pipeline::ErrorChangedTask,
- base::Unretained(this),
+ weak_factory_.GetWeakPtr(),
error));
}
@@ -286,7 +275,7 @@ void Pipeline::AddTextStream(DemuxerStream* text_stream,
const TextTrackConfig& config) {
task_runner_->PostTask(FROM_HERE,
base::Bind(&Pipeline::AddTextStreamTask,
- base::Unretained(this),
+ weak_factory_.GetWeakPtr(),
text_stream,
config));
}
@@ -294,7 +283,7 @@ void Pipeline::AddTextStream(DemuxerStream* text_stream,
void Pipeline::RemoveTextStream(DemuxerStream* text_stream) {
task_runner_->PostTask(FROM_HERE,
base::Bind(&Pipeline::RemoveTextStreamTask,
- base::Unretained(this),
+ weak_factory_.GetWeakPtr(),
text_stream));
}
@@ -558,6 +547,11 @@ void Pipeline::OnStopCompleted(PipelineStatus status) {
}
if (!stop_cb_.is_null()) {
error_cb_.Reset();
+
+ // Invalid all weak pointers so it's safe to destroy |this| on the render
+ // main thread.
+ weak_factory_.InvalidateWeakPtrs();
xhwang 2014/08/05 20:44:47 Move this down here because OnStopComplete() can a
+
base::ResetAndReturn(&stop_cb_).Run();
// NOTE: pipeline may be deleted at this point in time as a result of
« no previous file with comments | « no previous file | media/base/pipeline_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698