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 |