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

Side by Side Diff: components/sync/engine/browser_thread_model_worker.cc

Issue 2782573002: [Sync] Refactor ModelSafeWorker::DoWorkAndWaitUntilDone() to avoid code duplication. (Closed)
Patch Set: fix-test-error 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 "base/bind.h" 7 #include <utility>
8 #include "base/callback.h"
9 #include "base/synchronization/waitable_event.h"
10
11 using base::SingleThreadTaskRunner;
12 8
13 namespace syncer { 9 namespace syncer {
14 10
15 BrowserThreadModelWorker::BrowserThreadModelWorker( 11 BrowserThreadModelWorker::BrowserThreadModelWorker(
16 const scoped_refptr<SingleThreadTaskRunner>& runner, 12 const scoped_refptr<base::SingleThreadTaskRunner>& runner,
17 ModelSafeGroup group) 13 ModelSafeGroup group)
18 : runner_(runner), group_(group) {} 14 : runner_(runner), group_(group) {}
19 15
20 SyncerError BrowserThreadModelWorker::DoWorkAndWaitUntilDoneImpl( 16 void BrowserThreadModelWorker::ScheduleWork(base::Closure work) {
21 const WorkCallback& work) {
22 SyncerError error = UNSET;
23 if (runner_->BelongsToCurrentThread()) { 17 if (runner_->BelongsToCurrentThread()) {
24 DLOG(WARNING) << "Already on thread " << runner_; 18 DLOG(WARNING) << "Already on thread " << runner_;
25 return work.Run(); 19 work.Run();
20 return;
skym 2017/04/06 00:34:54 What do you think of an else clause instead of hav
fdoray 2017/04/06 18:10:55 Done.
26 } 21 }
27 22
28 // Signaled when the task is deleted, i.e. after it runs or when it is 23 runner_->PostTask(FROM_HERE, std::move(work));
skym 2017/04/06 00:34:54 You're very consistent with your std::move(work).
fdoray 2017/04/06 18:10:55 std::move() avoids ref count churn (see previous c
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;
46 } 24 }
47 25
48 ModelSafeGroup BrowserThreadModelWorker::GetModelSafeGroup() { 26 ModelSafeGroup BrowserThreadModelWorker::GetModelSafeGroup() {
49 return group_; 27 return group_;
50 } 28 }
51 29
52 bool BrowserThreadModelWorker::IsOnModelThread() { 30 bool BrowserThreadModelWorker::IsOnModelThread() {
53 return runner_->BelongsToCurrentThread(); 31 return runner_->BelongsToCurrentThread();
54 } 32 }
55 33
56 BrowserThreadModelWorker::~BrowserThreadModelWorker() {} 34 BrowserThreadModelWorker::~BrowserThreadModelWorker() {}
57 35
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
68 } // namespace syncer 36 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698