Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(474)

Unified Diff: components/password_manager/sync/browser/password_model_worker.cc

Issue 2820623002: Revert of [Sync] Refactor ModelSafeWorker::DoWorkAndWaitUntilDone() to avoid code duplication. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/password_manager/sync/browser/password_model_worker.h ('k') | components/sync/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « components/password_manager/sync/browser/password_model_worker.h ('k') | components/sync/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698