Chromium Code Reviews| Index: chrome/browser/chromeos/login/user_image_loader.cc |
| diff --git a/chrome/browser/chromeos/login/user_image_loader.cc b/chrome/browser/chromeos/login/user_image_loader.cc |
| index 89fae745c7470cdf743eb2dede89d70dd382861f..022d4b811b5da1688dae149f4d6c3f9298388442 100644 |
| --- a/chrome/browser/chromeos/login/user_image_loader.cc |
| +++ b/chrome/browser/chromeos/login/user_image_loader.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/file_util.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop.h" |
| +#include "base/threading/worker_pool.h" |
| #include "chrome/browser/chromeos/login/helper.h" |
| #include "chrome/browser/chromeos/login/user_image.h" |
| #include "content/public/browser/browser_thread.h" |
| @@ -44,14 +45,22 @@ void UserImageLoader::Start(const std::string& filepath, |
| target_message_loop_ = MessageLoop::current(); |
| ImageInfo image_info(size, loaded_cb); |
| - BrowserThread::PostTask( |
| - BrowserThread::FILE, FROM_HERE, |
| - base::Bind(&UserImageLoader::LoadImage, this, filepath, image_info)); |
| + base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); |
| + SequenceToken sequence_token = pool->GetSequenceToken(); |
| + scoped_refptr<base::SequencedTaskRunner> task_runner = pool-> |
| + GetSequencedTaskRunnerWithShutdownBehavior(sequence_token, |
| + base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); |
|
Joao da Silva
2013/01/21 08:07:39
If this is using a sequenced task runner then it w
bshe
2013/01/21 16:04:40
pool->GetSequenceToken will return a different tok
Joao da Silva
2013/01/21 16:46:58
Yes, you're right. Either call GetTaskRunnerWithSh
bshe
2013/01/21 22:53:07
It looks like UtilityProcessHost::Create require a
bshe
2013/01/22 03:48:57
Actually, the sequence task runner is running para
|
| + task_runner->PostTask( |
| + FROM_HERE, |
| + base::Bind(&UserImageLoader::LoadImage, this, filepath, image_info, |
| + sequence_token)); |
| } |
| void UserImageLoader::LoadImage(const std::string& filepath, |
| - const ImageInfo& image_info) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + const ImageInfo& image_info, |
| + const SequenceToken& sequence_token) { |
| + DCHECK(BrowserThread::GetBlockingPool()-> |
| + IsRunningSequenceOnCurrentThread(sequence_token)); |
| std::string image_data; |
| file_util::ReadFileToString(FilePath(filepath), &image_data); |
| @@ -59,17 +68,19 @@ void UserImageLoader::LoadImage(const std::string& filepath, |
| scoped_refptr<ImageDecoder> image_decoder = |
| new ImageDecoder(this, image_data, image_codec_); |
| image_info_map_.insert(std::make_pair(image_decoder.get(), image_info)); |
| - image_decoder->Start(); |
| + image_decoder->Start(sequence_token); |
| } |
| void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder, |
| const SkBitmap& decoded_image) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| - |
| - ImageInfoMap::iterator info_it = image_info_map_.find(decoder); |
| - if (info_it == image_info_map_.end()) { |
| - NOTREACHED(); |
| - return; |
| + ImageInfoMap::iterator info_it; |
| + { |
| + base::AutoLock lock(lock_); |
| + info_it = image_info_map_.find(decoder); |
| + if (info_it == image_info_map_.end()) { |
| + NOTREACHED(); |
| + return; |
| + } |
| } |
| const ImageInfo& image_info = info_it->second; |
|
Joao da Silva
2013/01/21 08:07:39
info_it may be invalid at this point, because anot
bshe
2013/01/21 16:04:40
If post back to UI, I worry this may be blocked on
Joao da Silva
2013/01/21 16:46:58
I'd be very surprised if UI is stuck at any moment
bshe
2013/01/21 22:53:07
Thanks. I will try to use lock to unblock the task
|
| @@ -102,23 +113,32 @@ void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder, |
| FROM_HERE, |
| base::Bind(image_info.loaded_cb, user_image)); |
| - image_info_map_.erase(info_it); |
| + { |
| + base::AutoLock lock(lock_); |
| + image_info_map_.erase(info_it); |
| + } |
| } |
| void UserImageLoader::OnDecodeImageFailed(const ImageDecoder* decoder) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| - |
| - ImageInfoMap::iterator info_it = image_info_map_.find(decoder); |
| - if (info_it == image_info_map_.end()) { |
| - NOTREACHED(); |
| - return; |
| + ImageInfoMap::iterator info_it; |
| + { |
| + base::AutoLock lock(lock_); |
| + info_it = image_info_map_.find(decoder); |
| + if (info_it == image_info_map_.end()) { |
| + NOTREACHED(); |
| + return; |
| + } |
| } |
| const ImageInfo& image_info = info_it->second; |
| target_message_loop_->PostTask( |
| FROM_HERE, |
| base::Bind(image_info.loaded_cb, UserImage())); |
| - image_info_map_.erase(decoder); |
| + |
| + { |
| + base::AutoLock lock(lock_); |
| + image_info_map_.erase(decoder); |
| + } |
| } |
| } // namespace chromeos |