| Index: webkit/glue/media/buffered_data_source.cc
|
| diff --git a/webkit/glue/media/buffered_data_source.cc b/webkit/glue/media/buffered_data_source.cc
|
| index 1a6c710b305c60e7816efa3fb3de95273a211c11..29df58f8c97d7b177bb8ff9f282aec5a0123df3c 100644
|
| --- a/webkit/glue/media/buffered_data_source.cc
|
| +++ b/webkit/glue/media/buffered_data_source.cc
|
| @@ -85,8 +85,10 @@ BufferedResourceLoader* BufferedDataSource::CreateResourceLoader(
|
| void BufferedDataSource::set_host(media::FilterHost* host) {
|
| DataSource::set_host(host);
|
|
|
| - if (loader_.get())
|
| - UpdateHostState();
|
| + if (loader_.get()) {
|
| + base::AutoLock auto_lock(lock_);
|
| + UpdateHostState_Locked();
|
| + }
|
| }
|
|
|
| void BufferedDataSource::Initialize(const std::string& url,
|
| @@ -104,7 +106,10 @@ void BufferedDataSource::Initialize(const std::string& url,
|
| }
|
|
|
| DCHECK(!callback.is_null());
|
| - initialize_cb_ = callback;
|
| + {
|
| + base::AutoLock auto_lock(lock_);
|
| + initialize_cb_ = callback;
|
| + }
|
|
|
| // Post a task to complete the initialization task.
|
| render_loop_->PostTask(FROM_HERE,
|
| @@ -210,8 +215,14 @@ void BufferedDataSource::Abort() {
|
| void BufferedDataSource::InitializeTask() {
|
| DCHECK(MessageLoop::current() == render_loop_);
|
| DCHECK(!loader_.get());
|
| - if (stopped_on_render_loop_ || initialize_cb_.is_null())
|
| - return;
|
| +
|
| + {
|
| + base::AutoLock auto_lock(lock_);
|
| + if (stopped_on_render_loop_ || initialize_cb_.is_null() ||
|
| + stop_signal_received_) {
|
| + return;
|
| + }
|
| + }
|
|
|
| if (url_.SchemeIs(kHttpScheme) || url_.SchemeIs(kHttpsScheme)) {
|
| // Do an unbounded range request starting at the beginning. If the server
|
| @@ -262,6 +273,7 @@ void BufferedDataSource::CleanupTask() {
|
|
|
| {
|
| base::AutoLock auto_lock(lock_);
|
| + initialize_cb_.Reset();
|
| if (stopped_on_render_loop_)
|
| return;
|
|
|
| @@ -334,6 +346,7 @@ void BufferedDataSource::SetBitrateTask(int bitrate) {
|
|
|
| BufferedResourceLoader::DeferStrategy
|
| BufferedDataSource::ChooseDeferStrategy() {
|
| + DCHECK(MessageLoop::current() == render_loop_);
|
| // If the user indicates preload=metadata, then just load exactly
|
| // what is needed for starting the pipeline and prerolling frames.
|
| if (preload_ == media::METADATA && !media_has_played_)
|
| @@ -411,7 +424,13 @@ void BufferedDataSource::HttpInitialStartCallback(int error) {
|
| int64 instance_size = loader_->instance_size();
|
| bool success = error == net::OK;
|
|
|
| - if (initialize_cb_.is_null()) {
|
| +
|
| + bool initialize_cb_is_null = false;
|
| + {
|
| + base::AutoLock auto_lock(lock_);
|
| + initialize_cb_is_null = initialize_cb_.is_null();
|
| + }
|
| + if (initialize_cb_is_null) {
|
| loader_->Stop();
|
| return;
|
| }
|
| @@ -465,7 +484,7 @@ void BufferedDataSource::HttpInitialStartCallback(int error) {
|
| return;
|
| }
|
|
|
| - UpdateHostState();
|
| + UpdateHostState_Locked();
|
| DoneInitialization_Locked(media::PIPELINE_OK);
|
| }
|
| }
|
| @@ -474,7 +493,12 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) {
|
| DCHECK(MessageLoop::current() == render_loop_);
|
| DCHECK(loader_.get());
|
|
|
| - if (initialize_cb_.is_null()) {
|
| + bool initialize_cb_is_null = false;
|
| + {
|
| + base::AutoLock auto_lock(lock_);
|
| + initialize_cb_is_null = initialize_cb_.is_null();
|
| + }
|
| + if (initialize_cb_is_null) {
|
| loader_->Stop();
|
| return;
|
| }
|
| @@ -514,7 +538,7 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) {
|
| return;
|
| }
|
|
|
| - UpdateHostState();
|
| + UpdateHostState_Locked();
|
| DoneInitialization_Locked(media::PIPELINE_OK);
|
| }
|
| }
|
| @@ -631,7 +655,10 @@ void BufferedDataSource::NetworkEventCallback() {
|
| host()->SetBufferedBytes(buffered_bytes_);
|
| }
|
|
|
| -void BufferedDataSource::UpdateHostState() {
|
| +void BufferedDataSource::UpdateHostState_Locked() {
|
| + // Called from various threads, under lock.
|
| + lock_.AssertAcquired();
|
| +
|
| media::FilterHost* filter_host = host();
|
| if (!filter_host)
|
| return;
|
|
|