OLD | NEW |
---|---|
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 |
OLD | NEW |