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 |