| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/bind.h" |
| 8 #include "base/bind_helpers.h" |
| 7 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 8 #include "base/threading/thread_local.h" | 10 #include "base/threading/thread_local.h" |
| 9 | 11 |
| 10 namespace jingle_glue { | 12 namespace jingle_glue { |
| 11 | 13 |
| 12 struct JingleThreadWrapper::PendingSend { | 14 struct JingleThreadWrapper::PendingSend { |
| 13 PendingSend(const talk_base::Message& message_value) | 15 PendingSend(const talk_base::Message& message_value) |
| 14 : sending_thread(JingleThreadWrapper::current()), | 16 : sending_thread(JingleThreadWrapper::current()), |
| 15 message(message_value), | 17 message(message_value), |
| 16 done_event(true, false) { | 18 done_event(true, false) { |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 | 148 |
| 147 PendingSend pending_send(message); | 149 PendingSend pending_send(message); |
| 148 { | 150 { |
| 149 base::AutoLock auto_lock(lock_); | 151 base::AutoLock auto_lock(lock_); |
| 150 pending_send_messages_.push_back(&pending_send); | 152 pending_send_messages_.push_back(&pending_send); |
| 151 } | 153 } |
| 152 | 154 |
| 153 // Need to signal |pending_send_event_| here in case the thread is | 155 // Need to signal |pending_send_event_| here in case the thread is |
| 154 // sending message to another thread. | 156 // sending message to another thread. |
| 155 pending_send_event_.Signal(); | 157 pending_send_event_.Signal(); |
| 156 message_loop_->PostTask(FROM_HERE, NewRunnableMethod( | 158 message_loop_->PostTask(FROM_HERE, |
| 157 this, &JingleThreadWrapper::ProcessPendingSends)); | 159 base::Bind(&JingleThreadWrapper::ProcessPendingSends, |
| 160 base::Unretained(this))); |
| 158 | 161 |
| 159 | 162 |
| 160 while (!pending_send.done_event.IsSignaled()) { | 163 while (!pending_send.done_event.IsSignaled()) { |
| 161 base::WaitableEvent* events[] = {&pending_send.done_event, | 164 base::WaitableEvent* events[] = {&pending_send.done_event, |
| 162 ¤t_thread->pending_send_event_}; | 165 ¤t_thread->pending_send_event_}; |
| 163 size_t event = base::WaitableEvent::WaitMany(events, arraysize(events)); | 166 size_t event = base::WaitableEvent::WaitMany(events, arraysize(events)); |
| 164 DCHECK(event == 0 || event == 1); | 167 DCHECK(event == 0 || event == 1); |
| 165 | 168 |
| 166 if (event == 1) | 169 if (event == 1) |
| 167 current_thread->ProcessPendingSends(); | 170 current_thread->ProcessPendingSends(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 197 message.phandler = handler; | 200 message.phandler = handler; |
| 198 message.message_id = message_id; | 201 message.message_id = message_id; |
| 199 message.pdata = data; | 202 message.pdata = data; |
| 200 { | 203 { |
| 201 base::AutoLock auto_lock(lock_); | 204 base::AutoLock auto_lock(lock_); |
| 202 task_id = ++last_task_id_; | 205 task_id = ++last_task_id_; |
| 203 messages_.insert(std::pair<int, talk_base::Message>(task_id, message)); | 206 messages_.insert(std::pair<int, talk_base::Message>(task_id, message)); |
| 204 } | 207 } |
| 205 | 208 |
| 206 if (delay_ms <= 0) { | 209 if (delay_ms <= 0) { |
| 207 message_loop_->PostTask(FROM_HERE, NewRunnableMethod( | 210 message_loop_->PostTask(FROM_HERE, |
| 208 this, &JingleThreadWrapper::RunTask, task_id)); | 211 base::Bind(&JingleThreadWrapper::RunTask, |
| 212 base::Unretained(this), task_id)); |
| 209 } else { | 213 } else { |
| 210 message_loop_->PostDelayedTask( | 214 message_loop_->PostDelayedTask(FROM_HERE, |
| 211 FROM_HERE, | 215 base::Bind(&JingleThreadWrapper::RunTask, |
| 212 NewRunnableMethod(this, &JingleThreadWrapper::RunTask, task_id), | 216 base::Unretained(this), task_id), |
| 213 delay_ms); | 217 delay_ms); |
| 214 } | 218 } |
| 215 } | 219 } |
| 216 | 220 |
| 217 void JingleThreadWrapper::RunTask(int task_id) { | 221 void JingleThreadWrapper::RunTask(int task_id) { |
| 218 bool have_message = false; | 222 bool have_message = false; |
| 219 talk_base::Message message; | 223 talk_base::Message message; |
| 220 { | 224 { |
| 221 base::AutoLock auto_lock(lock_); | 225 base::AutoLock auto_lock(lock_); |
| 222 MessagesQueue::iterator it = messages_.find(task_id); | 226 MessagesQueue::iterator it = messages_.find(task_id); |
| 223 if (it != messages_.end()) { | 227 if (it != messages_.end()) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 | 286 |
| 283 void JingleThreadWrapper::Stop() { | 287 void JingleThreadWrapper::Stop() { |
| 284 NOTREACHED(); | 288 NOTREACHED(); |
| 285 } | 289 } |
| 286 | 290 |
| 287 void JingleThreadWrapper::Run() { | 291 void JingleThreadWrapper::Run() { |
| 288 NOTREACHED(); | 292 NOTREACHED(); |
| 289 } | 293 } |
| 290 | 294 |
| 291 } // namespace jingle_glue | 295 } // namespace jingle_glue |
| OLD | NEW |