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

Unified Diff: chrome/browser/chromeos/login/user_image_loader.cc

Issue 11968044: Fix login visual hitch on chromebook (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add settings observer and using unnamed sequence thread Created 7 years, 11 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
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

Powered by Google App Engine
This is Rietveld 408576698