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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/sync/engine/browser_thread_model_worker.h" 5 #include "components/sync/engine/browser_thread_model_worker.h"
6 6
7 #include <utility> 7 #include "base/bind.h"
8 #include "base/callback.h"
9 #include "base/synchronization/waitable_event.h"
10
11 using base::SingleThreadTaskRunner;
8 12
9 namespace syncer { 13 namespace syncer {
10 14
11 BrowserThreadModelWorker::BrowserThreadModelWorker( 15 BrowserThreadModelWorker::BrowserThreadModelWorker(
12 const scoped_refptr<base::SingleThreadTaskRunner>& runner, 16 const scoped_refptr<SingleThreadTaskRunner>& runner,
13 ModelSafeGroup group) 17 ModelSafeGroup group)
14 : runner_(runner), group_(group) {} 18 : runner_(runner), group_(group) {}
15 19
16 void BrowserThreadModelWorker::ScheduleWork(base::OnceClosure work) { 20 SyncerError BrowserThreadModelWorker::DoWorkAndWaitUntilDoneImpl(
21 const WorkCallback& work) {
22 SyncerError error = UNSET;
17 if (runner_->BelongsToCurrentThread()) { 23 if (runner_->BelongsToCurrentThread()) {
18 DLOG(WARNING) << "Already on thread " << runner_; 24 DLOG(WARNING) << "Already on thread " << runner_;
19 std::move(work).Run(); 25 return work.Run();
20 } else {
21 runner_->PostTask(FROM_HERE, std::move(work));
22 } 26 }
27
28 // Signaled when the task is deleted, i.e. after it runs or when it is
29 // abandoned.
30 base::WaitableEvent work_done_or_abandoned(
31 base::WaitableEvent::ResetPolicy::AUTOMATIC,
32 base::WaitableEvent::InitialState::NOT_SIGNALED);
33
34 if (!runner_->PostTask(
35 FROM_HERE,
36 base::Bind(
37 &BrowserThreadModelWorker::CallDoWorkAndSignalTask, this, work,
38 base::Passed(syncer::ScopedEventSignal(&work_done_or_abandoned)),
39 &error))) {
40 DLOG(WARNING) << "Failed to post task to runner " << runner_;
41 error = CANNOT_DO_WORK;
42 return error;
43 }
44 work_done_or_abandoned.Wait();
45 return error;
23 } 46 }
24 47
25 ModelSafeGroup BrowserThreadModelWorker::GetModelSafeGroup() { 48 ModelSafeGroup BrowserThreadModelWorker::GetModelSafeGroup() {
26 return group_; 49 return group_;
27 } 50 }
28 51
29 bool BrowserThreadModelWorker::IsOnModelThread() { 52 bool BrowserThreadModelWorker::IsOnModelThread() {
30 return runner_->BelongsToCurrentThread(); 53 return runner_->BelongsToCurrentThread();
31 } 54 }
32 55
33 BrowserThreadModelWorker::~BrowserThreadModelWorker() {} 56 BrowserThreadModelWorker::~BrowserThreadModelWorker() {}
34 57
58 void BrowserThreadModelWorker::CallDoWorkAndSignalTask(
59 const WorkCallback& work,
60 syncer::ScopedEventSignal scoped_event_signal,
61 SyncerError* error) {
62 DCHECK(runner_->BelongsToCurrentThread());
63 if (!IsStopped())
64 *error = work.Run();
65 // The event in |scoped_event_signal| is signaled at the end of this scope.
66 }
67
35 } // namespace syncer 68 } // namespace syncer
OLDNEW
« 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