Commit 59f77380 authored by haitaol@chromium.org's avatar haitaol@chromium.org

Release password store on UI loop when worker is stopped so that password

service and thread can be shut down in proper order.

BUG=274705

Review URL: https://chromiumcodereview.appspot.com/23463033

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223427 0039d316-1c4b-4281-b951-d872f2087c98
parent be68c2ba
......@@ -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
......@@ -31,6 +31,7 @@ class PasswordModelWorker : public syncer::ModelSafeWorker {
// syncer::ModelSafeWorker implementation. Called on syncapi SyncerThread.
virtual void RegisterForLoopDestruction() OVERRIDE;
virtual syncer::ModelSafeGroup GetModelSafeGroup() OVERRIDE;
virtual void RequestStop() OVERRIDE;
protected:
virtual syncer::SyncerError DoWorkAndWaitUntilDoneImpl(
......@@ -48,6 +49,9 @@ class PasswordModelWorker : public syncer::ModelSafeWorker {
// observer.
void RegisterForPasswordLoopDestruction();
// |password_store_| is used on password thread but released on UI thread.
// Protected by |password_store_lock_|.
base::Lock password_store_lock_;
scoped_refptr<PasswordStore> password_store_;
DISALLOW_COPY_AND_ASSIGN(PasswordModelWorker);
};
......
......@@ -83,8 +83,8 @@ class SYNC_EXPORT ModelSafeWorker
SyncerError DoWorkAndWaitUntilDone(const WorkCallback& work);
// Soft stop worker by setting stopped_ flag. Called when sync is disabled
// or browser is shutting down.
void RequestStop();
// or browser is shutting down. Called on UI loop.
virtual void RequestStop();
virtual ModelSafeGroup GetModelSafeGroup() = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment