OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "base/memory/weak_ptr.h" | 5 #include "base/memory/weak_ptr.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 template <class T> | 26 template <class T> |
27 class OffThreadObjectCreator { | 27 class OffThreadObjectCreator { |
28 public: | 28 public: |
29 static T* NewObject() { | 29 static T* NewObject() { |
30 T* result; | 30 T* result; |
31 { | 31 { |
32 Thread creator_thread("creator_thread"); | 32 Thread creator_thread("creator_thread"); |
33 creator_thread.Start(); | 33 creator_thread.Start(); |
34 creator_thread.task_runner()->PostTask( | 34 creator_thread.task_runner()->PostTask( |
35 FROM_HERE, base::Bind(OffThreadObjectCreator::CreateObject, &result)); | 35 FROM_HERE, |
| 36 base::BindOnce(OffThreadObjectCreator::CreateObject, &result)); |
36 } | 37 } |
37 DCHECK(result); // We synchronized on thread destruction above. | 38 DCHECK(result); // We synchronized on thread destruction above. |
38 return result; | 39 return result; |
39 } | 40 } |
40 private: | 41 private: |
41 static void CreateObject(T** result) { | 42 static void CreateObject(T** result) { |
42 *result = new T; | 43 *result = new T; |
43 } | 44 } |
44 }; | 45 }; |
45 | 46 |
(...skipping 20 matching lines...) Expand all Loading... |
66 class BackgroundThread : public Thread { | 67 class BackgroundThread : public Thread { |
67 public: | 68 public: |
68 BackgroundThread() : Thread("owner_thread") {} | 69 BackgroundThread() : Thread("owner_thread") {} |
69 | 70 |
70 ~BackgroundThread() override { Stop(); } | 71 ~BackgroundThread() override { Stop(); } |
71 | 72 |
72 void CreateArrowFromTarget(Arrow** arrow, Target* target) { | 73 void CreateArrowFromTarget(Arrow** arrow, Target* target) { |
73 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, | 74 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, |
74 WaitableEvent::InitialState::NOT_SIGNALED); | 75 WaitableEvent::InitialState::NOT_SIGNALED); |
75 task_runner()->PostTask( | 76 task_runner()->PostTask( |
76 FROM_HERE, base::Bind(&BackgroundThread::DoCreateArrowFromTarget, arrow, | 77 FROM_HERE, base::BindOnce(&BackgroundThread::DoCreateArrowFromTarget, |
77 target, &completion)); | 78 arrow, target, &completion)); |
78 completion.Wait(); | 79 completion.Wait(); |
79 } | 80 } |
80 | 81 |
81 void CreateArrowFromArrow(Arrow** arrow, const Arrow* other) { | 82 void CreateArrowFromArrow(Arrow** arrow, const Arrow* other) { |
82 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, | 83 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, |
83 WaitableEvent::InitialState::NOT_SIGNALED); | 84 WaitableEvent::InitialState::NOT_SIGNALED); |
84 task_runner()->PostTask( | 85 task_runner()->PostTask( |
85 FROM_HERE, base::Bind(&BackgroundThread::DoCreateArrowFromArrow, arrow, | 86 FROM_HERE, base::BindOnce(&BackgroundThread::DoCreateArrowFromArrow, |
86 other, &completion)); | 87 arrow, other, &completion)); |
87 completion.Wait(); | 88 completion.Wait(); |
88 } | 89 } |
89 | 90 |
90 void DeleteTarget(Target* object) { | 91 void DeleteTarget(Target* object) { |
91 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, | 92 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, |
92 WaitableEvent::InitialState::NOT_SIGNALED); | 93 WaitableEvent::InitialState::NOT_SIGNALED); |
93 task_runner()->PostTask( | 94 task_runner()->PostTask( |
94 FROM_HERE, | 95 FROM_HERE, |
95 base::Bind(&BackgroundThread::DoDeleteTarget, object, &completion)); | 96 base::BindOnce(&BackgroundThread::DoDeleteTarget, object, &completion)); |
96 completion.Wait(); | 97 completion.Wait(); |
97 } | 98 } |
98 | 99 |
99 void CopyAndAssignArrow(Arrow* object) { | 100 void CopyAndAssignArrow(Arrow* object) { |
100 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, | 101 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, |
101 WaitableEvent::InitialState::NOT_SIGNALED); | 102 WaitableEvent::InitialState::NOT_SIGNALED); |
102 task_runner()->PostTask( | 103 task_runner()->PostTask( |
103 FROM_HERE, base::Bind(&BackgroundThread::DoCopyAndAssignArrow, object, | 104 FROM_HERE, base::BindOnce(&BackgroundThread::DoCopyAndAssignArrow, |
104 &completion)); | 105 object, &completion)); |
105 completion.Wait(); | 106 completion.Wait(); |
106 } | 107 } |
107 | 108 |
108 void CopyAndAssignArrowBase(Arrow* object) { | 109 void CopyAndAssignArrowBase(Arrow* object) { |
109 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, | 110 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, |
110 WaitableEvent::InitialState::NOT_SIGNALED); | 111 WaitableEvent::InitialState::NOT_SIGNALED); |
111 task_runner()->PostTask( | 112 task_runner()->PostTask( |
112 FROM_HERE, base::Bind(&BackgroundThread::DoCopyAndAssignArrowBase, | 113 FROM_HERE, base::BindOnce(&BackgroundThread::DoCopyAndAssignArrowBase, |
113 object, &completion)); | 114 object, &completion)); |
114 completion.Wait(); | 115 completion.Wait(); |
115 } | 116 } |
116 | 117 |
117 void DeleteArrow(Arrow* object) { | 118 void DeleteArrow(Arrow* object) { |
118 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, | 119 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, |
119 WaitableEvent::InitialState::NOT_SIGNALED); | 120 WaitableEvent::InitialState::NOT_SIGNALED); |
120 task_runner()->PostTask( | 121 task_runner()->PostTask( |
121 FROM_HERE, | 122 FROM_HERE, |
122 base::Bind(&BackgroundThread::DoDeleteArrow, object, &completion)); | 123 base::BindOnce(&BackgroundThread::DoDeleteArrow, object, &completion)); |
123 completion.Wait(); | 124 completion.Wait(); |
124 } | 125 } |
125 | 126 |
126 Target* DeRef(const Arrow* arrow) { | 127 Target* DeRef(const Arrow* arrow) { |
127 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, | 128 WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL, |
128 WaitableEvent::InitialState::NOT_SIGNALED); | 129 WaitableEvent::InitialState::NOT_SIGNALED); |
129 Target* result = nullptr; | 130 Target* result = nullptr; |
130 task_runner()->PostTask(FROM_HERE, base::Bind(&BackgroundThread::DoDeRef, | 131 task_runner()->PostTask( |
131 arrow, &result, &completion)); | 132 FROM_HERE, base::BindOnce(&BackgroundThread::DoDeRef, arrow, &result, |
| 133 &completion)); |
132 completion.Wait(); | 134 completion.Wait(); |
133 return result; | 135 return result; |
134 } | 136 } |
135 | 137 |
136 protected: | 138 protected: |
137 static void DoCreateArrowFromArrow(Arrow** arrow, | 139 static void DoCreateArrowFromArrow(Arrow** arrow, |
138 const Arrow* other, | 140 const Arrow* other, |
139 WaitableEvent* completion) { | 141 WaitableEvent* completion) { |
140 *arrow = new Arrow; | 142 *arrow = new Arrow; |
141 **arrow = *other; | 143 **arrow = *other; |
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 // Background thread tries to delete target, binding the object to the thread. | 671 // Background thread tries to delete target, binding the object to the thread. |
670 BackgroundThread background; | 672 BackgroundThread background; |
671 background.Start(); | 673 background.Start(); |
672 background.DeleteTarget(target.release()); | 674 background.DeleteTarget(target.release()); |
673 | 675 |
674 // Main thread attempts to dereference the target, violating thread binding. | 676 // Main thread attempts to dereference the target, violating thread binding. |
675 ASSERT_DCHECK_DEATH(arrow.target.get()); | 677 ASSERT_DCHECK_DEATH(arrow.target.get()); |
676 } | 678 } |
677 | 679 |
678 } // namespace base | 680 } // namespace base |
OLD | NEW |