OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "ipc/ipc_sync_channel.h" | 5 #include "ipc/ipc_sync_channel.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/thread_local.h" | 9 #include "base/thread_local.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 // SyncChannel objects can block the same thread). | 44 // SyncChannel objects can block the same thread). |
45 ReceivedSyncMsgQueue* rv = lazy_tls_ptr_.Pointer()->Get(); | 45 ReceivedSyncMsgQueue* rv = lazy_tls_ptr_.Pointer()->Get(); |
46 if (!rv) { | 46 if (!rv) { |
47 rv = new ReceivedSyncMsgQueue(); | 47 rv = new ReceivedSyncMsgQueue(); |
48 ReceivedSyncMsgQueue::lazy_tls_ptr_.Pointer()->Set(rv); | 48 ReceivedSyncMsgQueue::lazy_tls_ptr_.Pointer()->Set(rv); |
49 } | 49 } |
50 rv->listener_count_++; | 50 rv->listener_count_++; |
51 return rv; | 51 return rv; |
52 } | 52 } |
53 | 53 |
54 ~ReceivedSyncMsgQueue() { | |
55 } | |
56 | |
57 // Called on IPC thread when a synchronous message or reply arrives. | 54 // Called on IPC thread when a synchronous message or reply arrives. |
58 void QueueMessage(const Message& msg, SyncChannel::SyncContext* context) { | 55 void QueueMessage(const Message& msg, SyncChannel::SyncContext* context) { |
59 bool was_task_pending; | 56 bool was_task_pending; |
60 { | 57 { |
61 AutoLock auto_lock(message_lock_); | 58 AutoLock auto_lock(message_lock_); |
62 | 59 |
63 was_task_pending = task_pending_; | 60 was_task_pending = task_pending_; |
64 task_pending_ = true; | 61 task_pending_ = true; |
65 | 62 |
66 // We set the event in case the listener thread is blocked (or is about | 63 // We set the event in case the listener thread is blocked (or is about |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 | 147 |
151 base::WaitableEventWatcher* top_send_done_watcher() { | 148 base::WaitableEventWatcher* top_send_done_watcher() { |
152 return top_send_done_watcher_; | 149 return top_send_done_watcher_; |
153 } | 150 } |
154 | 151 |
155 void set_top_send_done_watcher(base::WaitableEventWatcher* watcher) { | 152 void set_top_send_done_watcher(base::WaitableEventWatcher* watcher) { |
156 top_send_done_watcher_ = watcher; | 153 top_send_done_watcher_ = watcher; |
157 } | 154 } |
158 | 155 |
159 private: | 156 private: |
| 157 friend class base::RefCountedThreadSafe<ReceivedSyncMsgQueue>; |
| 158 |
160 // See the comment in SyncChannel::SyncChannel for why this event is created | 159 // See the comment in SyncChannel::SyncChannel for why this event is created |
161 // as manual reset. | 160 // as manual reset. |
162 ReceivedSyncMsgQueue() : | 161 ReceivedSyncMsgQueue() : |
163 dispatch_event_(true, false), | 162 dispatch_event_(true, false), |
164 listener_message_loop_(MessageLoop::current()), | 163 listener_message_loop_(MessageLoop::current()), |
165 task_pending_(false), | 164 task_pending_(false), |
166 listener_count_(0), | 165 listener_count_(0), |
167 top_send_done_watcher_(NULL) { | 166 top_send_done_watcher_(NULL) { |
168 } | 167 } |
169 | 168 |
| 169 ~ReceivedSyncMsgQueue() {} |
| 170 |
170 // Holds information about a queued synchronous message or reply. | 171 // Holds information about a queued synchronous message or reply. |
171 struct QueuedMessage { | 172 struct QueuedMessage { |
172 QueuedMessage(Message* m, SyncContext* c) : message(m), context(c) { } | 173 QueuedMessage(Message* m, SyncContext* c) : message(m), context(c) { } |
173 Message* message; | 174 Message* message; |
174 scoped_refptr<SyncChannel::SyncContext> context; | 175 scoped_refptr<SyncChannel::SyncContext> context; |
175 }; | 176 }; |
176 | 177 |
177 typedef std::deque<QueuedMessage> SyncMessageQueue; | 178 typedef std::deque<QueuedMessage> SyncMessageQueue; |
178 SyncMessageQueue message_queue_; | 179 SyncMessageQueue message_queue_; |
179 | 180 |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 dispatch_watcher_.StartWatching(dispatch_event, this); | 483 dispatch_watcher_.StartWatching(dispatch_event, this); |
483 sync_context()->DispatchMessages(); | 484 sync_context()->DispatchMessages(); |
484 } else { | 485 } else { |
485 // We got the reply, timed out or the process shutdown. | 486 // We got the reply, timed out or the process shutdown. |
486 DCHECK(event == sync_context()->GetSendDoneEvent()); | 487 DCHECK(event == sync_context()->GetSendDoneEvent()); |
487 MessageLoop::current()->Quit(); | 488 MessageLoop::current()->Quit(); |
488 } | 489 } |
489 } | 490 } |
490 | 491 |
491 } // namespace IPC | 492 } // namespace IPC |
OLD | NEW |