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( |