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