| Index: chrome/browser/sync/glue/password_model_worker.cc
|
| diff --git a/chrome/browser/sync/glue/password_model_worker.cc b/chrome/browser/sync/glue/password_model_worker.cc
|
| index beaf5b15744f99bc7787ecdde1c40ba8db6cbe63..a01c0d9e5001e4ca40cf96d4a61bd90c4f327e9a 100644
|
| --- a/chrome/browser/sync/glue/password_model_worker.cc
|
| +++ b/chrome/browser/sync/glue/password_model_worker.cc
|
| @@ -22,6 +22,7 @@ PasswordModelWorker::PasswordModelWorker(
|
| }
|
|
|
| void PasswordModelWorker::RegisterForLoopDestruction() {
|
| + base::AutoLock lock(password_store_lock_);
|
| password_store_->ScheduleTask(
|
| base::Bind(&PasswordModelWorker::RegisterForPasswordLoopDestruction,
|
| this));
|
| @@ -30,13 +31,22 @@ void PasswordModelWorker::RegisterForLoopDestruction() {
|
| syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl(
|
| const syncer::WorkCallback& work) {
|
| syncer::SyncerError error = syncer::UNSET;
|
| - if (password_store_->ScheduleTask(
|
| - base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask,
|
| - this, work, work_done_or_stopped(), &error))) {
|
| +
|
| + bool scheduled = false;
|
| + {
|
| + base::AutoLock lock(password_store_lock_);
|
| + if (!password_store_.get())
|
| + return syncer::CANNOT_DO_WORK;
|
| +
|
| + scheduled = password_store_->ScheduleTask(
|
| + base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask,
|
| + this, work, work_done_or_stopped(), &error));
|
| + }
|
| +
|
| + if (scheduled)
|
| work_done_or_stopped()->Wait();
|
| - } else {
|
| + else
|
| error = syncer::CANNOT_DO_WORK;
|
| - }
|
| return error;
|
| }
|
|
|
| @@ -59,4 +69,11 @@ void PasswordModelWorker::RegisterForPasswordLoopDestruction() {
|
| SetWorkingLoopToCurrent();
|
| }
|
|
|
| +void PasswordModelWorker::RequestStop() {
|
| + ModelSafeWorker::RequestStop();
|
| +
|
| + base::AutoLock lock(password_store_lock_);
|
| + password_store_ = NULL;
|
| +}
|
| +
|
| } // namespace browser_sync
|
|
|