Chromium Code Reviews| Index: chrome/browser/image_decoder.cc |
| diff --git a/chrome/browser/image_decoder.cc b/chrome/browser/image_decoder.cc |
| index 6d7b948aa7f63a79dc817fc41088aec47cd588d3..3b166606887fe2e4969aae4bc366cd76e29dd1e0 100644 |
| --- a/chrome/browser/image_decoder.cc |
| +++ b/chrome/browser/image_decoder.cc |
| @@ -19,12 +19,14 @@ ImageDecoder::ImageDecoder(Delegate* delegate, |
| : delegate_(delegate), |
| image_data_(image_data.begin(), image_data.end()), |
| image_codec_(image_codec), |
| - target_thread_id_(BrowserThread::UI) { |
| + target_thread_id_(BrowserThread::UI), |
| + decode_on_sequence_worker_thread_(false) { |
| } |
| ImageDecoder::~ImageDecoder() {} |
| void ImageDecoder::Start() { |
| + decode_on_sequence_worker_thread_ = false; |
| if (!BrowserThread::GetCurrentThreadIdentifier(&target_thread_id_)) { |
| NOTREACHED(); |
| return; |
| @@ -34,6 +36,15 @@ void ImageDecoder::Start() { |
| base::Bind(&ImageDecoder::DecodeImageInSandbox, this, image_data_)); |
| } |
| +void ImageDecoder::Start( |
| + const base::SequencedWorkerPool::SequenceToken& sequence_token) { |
|
Joao da Silva
2013/01/21 08:07:39
Why not have a single Start() that gets a TaskRunn
bshe
2013/01/21 22:53:07
Good idea!
We only have one Start function now.
O
|
| + sequence_token_ = sequence_token; |
| + decode_on_sequence_worker_thread_ = true; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&ImageDecoder::DecodeImageInSandbox, this, image_data_)); |
|
Joao da Silva
2013/01/21 08:07:39
nit: indent (4 spaces)
bshe
2013/01/21 22:53:07
This is an argument of function PostTask, same as
|
| +} |
| + |
| bool ImageDecoder::OnMessageReceived(const IPC::Message& message) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(ImageDecoder, message) |
| @@ -46,14 +57,23 @@ bool ImageDecoder::OnMessageReceived(const IPC::Message& message) { |
| return handled; |
| } |
| +bool ImageDecoder::CalledOnValidThreadOrWorkerThread() { |
| + if (decode_on_sequence_worker_thread_) { |
| + return BrowserThread::GetBlockingPool()-> |
| + IsRunningSequenceOnCurrentThread(sequence_token_); |
| + } else { |
| + return BrowserThread::CurrentlyOn(target_thread_id_); |
| + } |
| +} |
| + |
| void ImageDecoder::OnDecodeImageSucceeded(const SkBitmap& decoded_image) { |
| - DCHECK(BrowserThread::CurrentlyOn(target_thread_id_)); |
| + DCHECK(CalledOnValidThreadOrWorkerThread()); |
| if (delegate_) |
| delegate_->OnImageDecoded(this, decoded_image); |
| } |
| void ImageDecoder::OnDecodeImageFailed() { |
| - DCHECK(BrowserThread::CurrentlyOn(target_thread_id_)); |
| + DCHECK(CalledOnValidThreadOrWorkerThread()); |
| if (delegate_) |
| delegate_->OnDecodeImageFailed(this); |
| } |
| @@ -61,8 +81,15 @@ void ImageDecoder::OnDecodeImageFailed() { |
| void ImageDecoder::DecodeImageInSandbox( |
| const std::vector<unsigned char>& image_data) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - UtilityProcessHost* utility_process_host = UtilityProcessHost::Create( |
| - this, BrowserThread::GetMessageLoopProxyForThread(target_thread_id_)); |
| + UtilityProcessHost* utility_process_host; |
| + if (decode_on_sequence_worker_thread_) { |
| + utility_process_host = UtilityProcessHost::Create( |
| + this, BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( |
| + sequence_token_).get()); |
| + } else { |
| + utility_process_host = UtilityProcessHost::Create( |
| + this, BrowserThread::GetMessageLoopProxyForThread(target_thread_id_)); |
| + } |
| utility_process_host->EnableZygote(); |
| if (image_codec_ == ROBUST_JPEG_CODEC) { |
| utility_process_host->Send( |