| Index: components/password_manager/sync/browser/password_model_worker.cc
|
| diff --git a/components/password_manager/sync/browser/password_model_worker.cc b/components/password_manager/sync/browser/password_model_worker.cc
|
| index 997a0b1cbe17168918e95fd2ef162f0713295dbd..81fb889b3b53dfbbfb756cde2a379247fd2e608d 100644
|
| --- a/components/password_manager/sync/browser/password_model_worker.cc
|
| +++ b/components/password_manager/sync/browser/password_model_worker.cc
|
| @@ -4,16 +4,58 @@
|
|
|
| #include "components/password_manager/sync/browser/password_model_worker.h"
|
|
|
| -#include <utility>
|
| -
|
| +#include "base/bind.h"
|
| +#include "base/callback.h"
|
| +#include "base/synchronization/waitable_event.h"
|
| #include "components/password_manager/core/browser/password_store.h"
|
| +#include "components/sync/base/scoped_event_signal.h"
|
|
|
| namespace browser_sync {
|
| +
|
| +namespace {
|
| +
|
| +void CallDoWorkAndSignalEvent(const syncer::WorkCallback& work,
|
| + syncer::ScopedEventSignal scoped_event_signal,
|
| + syncer::SyncerError* error_info) {
|
| + *error_info = work.Run();
|
| + // The event in |scoped_event_signal| is signaled at the end of this scope.
|
| +}
|
| +
|
| +} // namespace
|
|
|
| PasswordModelWorker::PasswordModelWorker(
|
| const scoped_refptr<password_manager::PasswordStore>& password_store)
|
| : password_store_(password_store) {
|
| DCHECK(password_store.get());
|
| +}
|
| +
|
| +syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl(
|
| + const syncer::WorkCallback& work) {
|
| + syncer::SyncerError error = syncer::UNSET;
|
| +
|
| + // Signaled when the task is deleted, i.e. after it runs or when it is
|
| + // abandoned.
|
| + base::WaitableEvent work_done_or_abandoned(
|
| + base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
| + base::WaitableEvent::InitialState::NOT_SIGNALED);
|
| +
|
| + bool scheduled = false;
|
| + {
|
| + base::AutoLock lock(password_store_lock_);
|
| + if (!password_store_.get())
|
| + return syncer::CANNOT_DO_WORK;
|
| +
|
| + scheduled = password_store_->ScheduleTask(base::Bind(
|
| + &CallDoWorkAndSignalEvent, work,
|
| + base::Passed(syncer::ScopedEventSignal(&work_done_or_abandoned)),
|
| + &error));
|
| + }
|
| +
|
| + if (scheduled)
|
| + work_done_or_abandoned.Wait();
|
| + else
|
| + error = syncer::CANNOT_DO_WORK;
|
| + return error;
|
| }
|
|
|
| syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() {
|
| @@ -29,15 +71,6 @@
|
|
|
| PasswordModelWorker::~PasswordModelWorker() {}
|
|
|
| -void PasswordModelWorker::ScheduleWork(base::OnceClosure work) {
|
| - base::AutoLock lock(password_store_lock_);
|
| - if (password_store_) {
|
| - password_store_->ScheduleTask(
|
| - base::Bind([](base::OnceClosure work) { std::move(work).Run(); },
|
| - base::Passed(std::move(work))));
|
| - }
|
| -}
|
| -
|
| void PasswordModelWorker::RequestStop() {
|
| ModelSafeWorker::RequestStop();
|
|
|
|
|