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

Unified Diff: components/sync/engine/browser_thread_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
Index: components/sync/engine/browser_thread_model_worker.cc
diff --git a/components/sync/engine/browser_thread_model_worker.cc b/components/sync/engine/browser_thread_model_worker.cc
index a6d92c54d56cd14e69c57e83083991bed7815162..3b29d8505a09387f3950b52bc29fc0ca81b87f1c 100644
--- a/components/sync/engine/browser_thread_model_worker.cc
+++ b/components/sync/engine/browser_thread_model_worker.cc
@@ -4,22 +4,45 @@
#include "components/sync/engine/browser_thread_model_worker.h"
-#include <utility>
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/synchronization/waitable_event.h"
+
+using base::SingleThreadTaskRunner;
namespace syncer {
BrowserThreadModelWorker::BrowserThreadModelWorker(
- const scoped_refptr<base::SingleThreadTaskRunner>& runner,
+ const scoped_refptr<SingleThreadTaskRunner>& runner,
ModelSafeGroup group)
: runner_(runner), group_(group) {}
-void BrowserThreadModelWorker::ScheduleWork(base::OnceClosure work) {
+SyncerError BrowserThreadModelWorker::DoWorkAndWaitUntilDoneImpl(
+ const WorkCallback& work) {
+ SyncerError error = UNSET;
if (runner_->BelongsToCurrentThread()) {
DLOG(WARNING) << "Already on thread " << runner_;
- std::move(work).Run();
- } else {
- runner_->PostTask(FROM_HERE, std::move(work));
+ return work.Run();
}
+
+ // 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);
+
+ if (!runner_->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &BrowserThreadModelWorker::CallDoWorkAndSignalTask, this, work,
+ base::Passed(syncer::ScopedEventSignal(&work_done_or_abandoned)),
+ &error))) {
+ DLOG(WARNING) << "Failed to post task to runner " << runner_;
+ error = CANNOT_DO_WORK;
+ return error;
+ }
+ work_done_or_abandoned.Wait();
+ return error;
}
ModelSafeGroup BrowserThreadModelWorker::GetModelSafeGroup() {
@@ -32,4 +55,14 @@
BrowserThreadModelWorker::~BrowserThreadModelWorker() {}
+void BrowserThreadModelWorker::CallDoWorkAndSignalTask(
+ const WorkCallback& work,
+ syncer::ScopedEventSignal scoped_event_signal,
+ SyncerError* error) {
+ DCHECK(runner_->BelongsToCurrentThread());
+ if (!IsStopped())
+ *error = work.Run();
+ // The event in |scoped_event_signal| is signaled at the end of this scope.
+}
+
} // namespace syncer
« no previous file with comments | « components/sync/engine/browser_thread_model_worker.h ('k') | components/sync/engine/browser_thread_model_worker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698