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 "jingle/glue/thread_wrapper.h" | 5 #include "jingle/glue/thread_wrapper.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/threading/thread_local.h" | 14 #include "base/threading/thread_local.h" |
| 15 #include "base/trace_event/trace_event.h" |
15 #include "third_party/webrtc/base/nullsocketserver.h" | 16 #include "third_party/webrtc/base/nullsocketserver.h" |
16 | 17 |
17 namespace jingle_glue { | 18 namespace jingle_glue { |
18 | 19 |
19 struct JingleThreadWrapper::PendingSend { | 20 struct JingleThreadWrapper::PendingSend { |
20 PendingSend(const rtc::Message& message_value) | 21 PendingSend(const rtc::Message& message_value) |
21 : sending_thread(JingleThreadWrapper::current()), | 22 : sending_thread(JingleThreadWrapper::current()), |
22 message(message_value), | 23 message(message_value), |
23 done_event(base::WaitableEvent::ResetPolicy::MANUAL, | 24 done_event(base::WaitableEvent::ResetPolicy::MANUAL, |
24 base::WaitableEvent::InitialState::NOT_SIGNALED) { | 25 base::WaitableEvent::InitialState::NOT_SIGNALED) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 rtc::MessageQueueManager::Remove(this); | 86 rtc::MessageQueueManager::Remove(this); |
86 g_jingle_thread_wrapper.Get().Set(nullptr); | 87 g_jingle_thread_wrapper.Get().Set(nullptr); |
87 | 88 |
88 Clear(nullptr, rtc::MQID_ANY, nullptr); | 89 Clear(nullptr, rtc::MQID_ANY, nullptr); |
89 } | 90 } |
90 | 91 |
91 void JingleThreadWrapper::WillDestroyCurrentMessageLoop() { | 92 void JingleThreadWrapper::WillDestroyCurrentMessageLoop() { |
92 delete this; | 93 delete this; |
93 } | 94 } |
94 | 95 |
95 void JingleThreadWrapper::Post(rtc::MessageHandler* handler, | 96 void JingleThreadWrapper::Post(const rtc::Location& posted_from, |
| 97 rtc::MessageHandler* handler, |
96 uint32_t message_id, | 98 uint32_t message_id, |
97 rtc::MessageData* data, | 99 rtc::MessageData* data, |
98 bool time_sensitive) { | 100 bool time_sensitive) { |
99 PostTaskInternal(0, handler, message_id, data); | 101 PostTaskInternal(posted_from, 0, handler, message_id, data); |
100 } | 102 } |
101 | 103 |
102 void JingleThreadWrapper::PostDelayed(int delay_ms, | 104 void JingleThreadWrapper::PostDelayed(const rtc::Location& posted_from, |
| 105 int delay_ms, |
103 rtc::MessageHandler* handler, | 106 rtc::MessageHandler* handler, |
104 uint32_t message_id, | 107 uint32_t message_id, |
105 rtc::MessageData* data) { | 108 rtc::MessageData* data) { |
106 PostTaskInternal(delay_ms, handler, message_id, data); | 109 PostTaskInternal(posted_from, delay_ms, handler, message_id, data); |
107 } | 110 } |
108 | 111 |
109 void JingleThreadWrapper::Clear(rtc::MessageHandler* handler, | 112 void JingleThreadWrapper::Clear(rtc::MessageHandler* handler, |
110 uint32_t id, | 113 uint32_t id, |
111 rtc::MessageList* removed) { | 114 rtc::MessageList* removed) { |
112 base::AutoLock auto_lock(lock_); | 115 base::AutoLock auto_lock(lock_); |
113 | 116 |
114 for (MessagesQueue::iterator it = messages_.begin(); | 117 for (MessagesQueue::iterator it = messages_.begin(); |
115 it != messages_.end();) { | 118 it != messages_.end();) { |
116 MessagesQueue::iterator next = it; | 119 MessagesQueue::iterator next = it; |
(...skipping 23 matching lines...) Expand all Loading... |
140 delete (*it)->message.pdata; | 143 delete (*it)->message.pdata; |
141 } | 144 } |
142 (*it)->done_event.Signal(); | 145 (*it)->done_event.Signal(); |
143 pending_send_messages_.erase(it); | 146 pending_send_messages_.erase(it); |
144 } | 147 } |
145 | 148 |
146 it = next; | 149 it = next; |
147 } | 150 } |
148 } | 151 } |
149 | 152 |
150 void JingleThreadWrapper::Send(rtc::MessageHandler* handler, | 153 void JingleThreadWrapper::Dispatch(rtc::Message* message) { |
| 154 TRACE_EVENT2("webrtc", "JingleThreadWrapper::Dispatch", "src_file_and_line", |
| 155 message->posted_from.file_and_line(), "src_func", |
| 156 message->posted_from.function_name()); |
| 157 message->phandler->OnMessage(message); |
| 158 } |
| 159 |
| 160 void JingleThreadWrapper::Send(const rtc::Location& posted_from, |
| 161 rtc::MessageHandler* handler, |
151 uint32_t id, | 162 uint32_t id, |
152 rtc::MessageData* data) { | 163 rtc::MessageData* data) { |
153 if (fStop_) | 164 if (fStop_) |
154 return; | 165 return; |
155 | 166 |
156 JingleThreadWrapper* current_thread = JingleThreadWrapper::current(); | 167 JingleThreadWrapper* current_thread = JingleThreadWrapper::current(); |
157 DCHECK(current_thread != nullptr) << "Send() can be called only from a " | 168 DCHECK(current_thread != nullptr) << "Send() can be called only from a " |
158 "thread that has JingleThreadWrapper."; | 169 "thread that has JingleThreadWrapper."; |
159 | 170 |
160 rtc::Message message; | 171 rtc::Message message; |
| 172 message.posted_from = posted_from; |
161 message.phandler = handler; | 173 message.phandler = handler; |
162 message.message_id = id; | 174 message.message_id = id; |
163 message.pdata = data; | 175 message.pdata = data; |
164 | 176 |
165 if (current_thread == this) { | 177 if (current_thread == this) { |
166 handler->OnMessage(&message); | 178 Dispatch(&message); |
167 return; | 179 return; |
168 } | 180 } |
169 | 181 |
170 // Send message from a thread different than |this|. | 182 // Send message from a thread different than |this|. |
171 | 183 |
172 // Allow inter-thread send only from threads that have | 184 // Allow inter-thread send only from threads that have |
173 // |send_allowed_| flag set. | 185 // |send_allowed_| flag set. |
174 DCHECK(current_thread->send_allowed_) << "Send()'ing synchronous " | 186 DCHECK(current_thread->send_allowed_) << "Send()'ing synchronous " |
175 "messages is not allowed from the current thread."; | 187 "messages is not allowed from the current thread."; |
176 | 188 |
(...skipping 30 matching lines...) Expand all Loading... |
207 if (!pending_send_messages_.empty()) { | 219 if (!pending_send_messages_.empty()) { |
208 pending_send = pending_send_messages_.front(); | 220 pending_send = pending_send_messages_.front(); |
209 pending_send_messages_.pop_front(); | 221 pending_send_messages_.pop_front(); |
210 } else { | 222 } else { |
211 // Reset the event while |lock_| is still locked. | 223 // Reset the event while |lock_| is still locked. |
212 pending_send_event_.Reset(); | 224 pending_send_event_.Reset(); |
213 break; | 225 break; |
214 } | 226 } |
215 } | 227 } |
216 if (pending_send) { | 228 if (pending_send) { |
217 pending_send->message.phandler->OnMessage(&pending_send->message); | 229 Dispatch(&pending_send->message); |
218 pending_send->done_event.Signal(); | 230 pending_send->done_event.Signal(); |
219 } | 231 } |
220 } | 232 } |
221 } | 233 } |
222 | 234 |
223 void JingleThreadWrapper::PostTaskInternal(int delay_ms, | 235 void JingleThreadWrapper::PostTaskInternal(const rtc::Location& posted_from, |
| 236 int delay_ms, |
224 rtc::MessageHandler* handler, | 237 rtc::MessageHandler* handler, |
225 uint32_t message_id, | 238 uint32_t message_id, |
226 rtc::MessageData* data) { | 239 rtc::MessageData* data) { |
227 int task_id; | 240 int task_id; |
228 rtc::Message message; | 241 rtc::Message message; |
| 242 message.posted_from = posted_from; |
229 message.phandler = handler; | 243 message.phandler = handler; |
230 message.message_id = message_id; | 244 message.message_id = message_id; |
231 message.pdata = data; | 245 message.pdata = data; |
232 { | 246 { |
233 base::AutoLock auto_lock(lock_); | 247 base::AutoLock auto_lock(lock_); |
234 task_id = ++last_task_id_; | 248 task_id = ++last_task_id_; |
235 messages_.insert(std::pair<int, rtc::Message>(task_id, message)); | 249 messages_.insert(std::pair<int, rtc::Message>(task_id, message)); |
236 } | 250 } |
237 | 251 |
238 if (delay_ms <= 0) { | 252 if (delay_ms <= 0) { |
(...skipping 19 matching lines...) Expand all Loading... |
258 message = it->second; | 272 message = it->second; |
259 messages_.erase(it); | 273 messages_.erase(it); |
260 } | 274 } |
261 } | 275 } |
262 | 276 |
263 if (have_message) { | 277 if (have_message) { |
264 if (message.message_id == rtc::MQID_DISPOSE) { | 278 if (message.message_id == rtc::MQID_DISPOSE) { |
265 DCHECK(message.phandler == nullptr); | 279 DCHECK(message.phandler == nullptr); |
266 delete message.pdata; | 280 delete message.pdata; |
267 } else { | 281 } else { |
268 message.phandler->OnMessage(&message); | 282 Dispatch(&message); |
269 } | 283 } |
270 } | 284 } |
271 } | 285 } |
272 | 286 |
273 // All methods below are marked as not reached. See comments in the | 287 // All methods below are marked as not reached. See comments in the |
274 // header for more details. | 288 // header for more details. |
275 void JingleThreadWrapper::Quit() { | 289 void JingleThreadWrapper::Quit() { |
276 NOTREACHED(); | 290 NOTREACHED(); |
277 } | 291 } |
278 | 292 |
279 bool JingleThreadWrapper::IsQuitting() { | 293 bool JingleThreadWrapper::IsQuitting() { |
280 NOTREACHED(); | 294 NOTREACHED(); |
281 return false; | 295 return false; |
282 } | 296 } |
283 | 297 |
284 void JingleThreadWrapper::Restart() { | 298 void JingleThreadWrapper::Restart() { |
285 NOTREACHED(); | 299 NOTREACHED(); |
286 } | 300 } |
287 | 301 |
288 bool JingleThreadWrapper::Get(rtc::Message*, int, bool) { | 302 bool JingleThreadWrapper::Get(rtc::Message*, int, bool) { |
289 NOTREACHED(); | 303 NOTREACHED(); |
290 return false; | 304 return false; |
291 } | 305 } |
292 | 306 |
293 bool JingleThreadWrapper::Peek(rtc::Message*, int) { | 307 bool JingleThreadWrapper::Peek(rtc::Message*, int) { |
294 NOTREACHED(); | 308 NOTREACHED(); |
295 return false; | 309 return false; |
296 } | 310 } |
297 | 311 |
298 void JingleThreadWrapper::PostAt(uint32_t, | 312 void JingleThreadWrapper::PostAt(const rtc::Location& posted_from, |
| 313 uint32_t, |
299 rtc::MessageHandler*, | 314 rtc::MessageHandler*, |
300 uint32_t, | 315 uint32_t, |
301 rtc::MessageData*) { | 316 rtc::MessageData*) { |
302 NOTREACHED(); | 317 NOTREACHED(); |
303 } | 318 } |
304 | 319 |
305 void JingleThreadWrapper::Dispatch(rtc::Message* message) { | |
306 NOTREACHED(); | |
307 } | |
308 | |
309 void JingleThreadWrapper::ReceiveSends() { | 320 void JingleThreadWrapper::ReceiveSends() { |
310 NOTREACHED(); | 321 NOTREACHED(); |
311 } | 322 } |
312 | 323 |
313 int JingleThreadWrapper::GetDelay() { | 324 int JingleThreadWrapper::GetDelay() { |
314 NOTREACHED(); | 325 NOTREACHED(); |
315 return 0; | 326 return 0; |
316 } | 327 } |
317 | 328 |
318 void JingleThreadWrapper::Stop() { | 329 void JingleThreadWrapper::Stop() { |
319 NOTREACHED(); | 330 NOTREACHED(); |
320 } | 331 } |
321 | 332 |
322 void JingleThreadWrapper::Run() { | 333 void JingleThreadWrapper::Run() { |
323 NOTREACHED(); | 334 NOTREACHED(); |
324 } | 335 } |
325 | 336 |
326 } // namespace jingle_glue | 337 } // namespace jingle_glue |
OLD | NEW |