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( ...@@ -22,6 +22,7 @@ PasswordModelWorker::PasswordModelWorker(
} }
void PasswordModelWorker::RegisterForLoopDestruction() { void PasswordModelWorker::RegisterForLoopDestruction() {
base::AutoLock lock(password_store_lock_);
password_store_->ScheduleTask( password_store_->ScheduleTask(
base::Bind(&PasswordModelWorker::RegisterForPasswordLoopDestruction, base::Bind(&PasswordModelWorker::RegisterForPasswordLoopDestruction,
this)); this));
...@@ -30,13 +31,22 @@ void PasswordModelWorker::RegisterForLoopDestruction() { ...@@ -30,13 +31,22 @@ void PasswordModelWorker::RegisterForLoopDestruction() {
syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl( syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl(
const syncer::WorkCallback& work) { const syncer::WorkCallback& work) {
syncer::SyncerError error = syncer::UNSET; syncer::SyncerError error = syncer::UNSET;
if (password_store_->ScheduleTask(
base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask, bool scheduled = false;
this, work, work_done_or_stopped(), &error))) { {
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(); work_done_or_stopped()->Wait();
} else { else
error = syncer::CANNOT_DO_WORK; error = syncer::CANNOT_DO_WORK;
}
return error; return error;
} }
...@@ -59,4 +69,11 @@ void PasswordModelWorker::RegisterForPasswordLoopDestruction() { ...@@ -59,4 +69,11 @@ void PasswordModelWorker::RegisterForPasswordLoopDestruction() {
SetWorkingLoopToCurrent(); SetWorkingLoopToCurrent();
} }
void PasswordModelWorker::RequestStop() {
ModelSafeWorker::RequestStop();
base::AutoLock lock(password_store_lock_);
password_store_ = NULL;
}
} // namespace browser_sync } // namespace browser_sync
...@@ -31,6 +31,7 @@ class PasswordModelWorker : public syncer::ModelSafeWorker { ...@@ -31,6 +31,7 @@ class PasswordModelWorker : public syncer::ModelSafeWorker {
// syncer::ModelSafeWorker implementation. Called on syncapi SyncerThread. // syncer::ModelSafeWorker implementation. Called on syncapi SyncerThread.
virtual void RegisterForLoopDestruction() OVERRIDE; virtual void RegisterForLoopDestruction() OVERRIDE;
virtual syncer::ModelSafeGroup GetModelSafeGroup() OVERRIDE; virtual syncer::ModelSafeGroup GetModelSafeGroup() OVERRIDE;
virtual void RequestStop() OVERRIDE;
protected: protected:
virtual syncer::SyncerError DoWorkAndWaitUntilDoneImpl( virtual syncer::SyncerError DoWorkAndWaitUntilDoneImpl(
...@@ -48,6 +49,9 @@ class PasswordModelWorker : public syncer::ModelSafeWorker { ...@@ -48,6 +49,9 @@ class PasswordModelWorker : public syncer::ModelSafeWorker {
// observer. // observer.
void RegisterForPasswordLoopDestruction(); 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_; scoped_refptr<PasswordStore> password_store_;
DISALLOW_COPY_AND_ASSIGN(PasswordModelWorker); DISALLOW_COPY_AND_ASSIGN(PasswordModelWorker);
}; };
......
...@@ -83,8 +83,8 @@ class SYNC_EXPORT ModelSafeWorker ...@@ -83,8 +83,8 @@ class SYNC_EXPORT ModelSafeWorker
SyncerError DoWorkAndWaitUntilDone(const WorkCallback& work); SyncerError DoWorkAndWaitUntilDone(const WorkCallback& work);
// Soft stop worker by setting stopped_ flag. Called when sync is disabled // Soft stop worker by setting stopped_ flag. Called when sync is disabled
// or browser is shutting down. // or browser is shutting down. Called on UI loop.
void RequestStop(); virtual void RequestStop();
virtual ModelSafeGroup GetModelSafeGroup() = 0; 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