| 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 "ipc/ipc_sync_channel.h" | 5 #include "ipc/ipc_sync_channel.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 while (true) { | 96 while (true) { |
| 97 Message* message = NULL; | 97 Message* message = NULL; |
| 98 scoped_refptr<SyncChannel::SyncContext> context; | 98 scoped_refptr<SyncChannel::SyncContext> context; |
| 99 { | 99 { |
| 100 base::AutoLock auto_lock(message_lock_); | 100 base::AutoLock auto_lock(message_lock_); |
| 101 if (first_time || message_queue_version_ != expected_version) { | 101 if (first_time || message_queue_version_ != expected_version) { |
| 102 it = message_queue_.begin(); | 102 it = message_queue_.begin(); |
| 103 first_time = false; | 103 first_time = false; |
| 104 } | 104 } |
| 105 for (; it != message_queue_.end(); it++) { | 105 for (; it != message_queue_.end(); it++) { |
| 106 if (!it->context->restrict_dispatch() || | 106 int message_group = it->context->restrict_dispatch_group(); |
| 107 it->context == dispatching_context) { | 107 if (message_group == kRestrictDispatchGroup_None || |
| 108 message_group == dispatching_context->restrict_dispatch_group()) { |
| 108 message = it->message; | 109 message = it->message; |
| 109 context = it->context; | 110 context = it->context; |
| 110 it = message_queue_.erase(it); | 111 it = message_queue_.erase(it); |
| 111 message_queue_version_++; | 112 message_queue_version_++; |
| 112 expected_version = message_queue_version_; | 113 expected_version = message_queue_version_; |
| 113 break; | 114 break; |
| 114 } | 115 } |
| 115 } | 116 } |
| 116 } | 117 } |
| 117 | 118 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 SyncChannel::ReceivedSyncMsgQueue::lazy_tls_ptr_ = | 222 SyncChannel::ReceivedSyncMsgQueue::lazy_tls_ptr_ = |
| 222 LAZY_INSTANCE_INITIALIZER; | 223 LAZY_INSTANCE_INITIALIZER; |
| 223 | 224 |
| 224 SyncChannel::SyncContext::SyncContext( | 225 SyncChannel::SyncContext::SyncContext( |
| 225 Channel::Listener* listener, | 226 Channel::Listener* listener, |
| 226 base::MessageLoopProxy* ipc_thread, | 227 base::MessageLoopProxy* ipc_thread, |
| 227 WaitableEvent* shutdown_event) | 228 WaitableEvent* shutdown_event) |
| 228 : ChannelProxy::Context(listener, ipc_thread), | 229 : ChannelProxy::Context(listener, ipc_thread), |
| 229 received_sync_msgs_(ReceivedSyncMsgQueue::AddContext()), | 230 received_sync_msgs_(ReceivedSyncMsgQueue::AddContext()), |
| 230 shutdown_event_(shutdown_event), | 231 shutdown_event_(shutdown_event), |
| 231 restrict_dispatch_(false) { | 232 restrict_dispatch_group_(kRestrictDispatchGroup_None) { |
| 232 } | 233 } |
| 233 | 234 |
| 234 SyncChannel::SyncContext::~SyncContext() { | 235 SyncChannel::SyncContext::~SyncContext() { |
| 235 while (!deserializers_.empty()) | 236 while (!deserializers_.empty()) |
| 236 Pop(); | 237 Pop(); |
| 237 } | 238 } |
| 238 | 239 |
| 239 // Adds information about an outgoing sync message to the context so that | 240 // Adds information about an outgoing sync message to the context so that |
| 240 // we know how to deserialize the reply. Returns a handle that's set when | 241 // we know how to deserialize the reply. Returns a handle that's set when |
| 241 // the reply has arrived. | 242 // the reply has arrived. |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 base::MessageLoopProxy* ipc_message_loop, | 402 base::MessageLoopProxy* ipc_message_loop, |
| 402 WaitableEvent* shutdown_event) | 403 WaitableEvent* shutdown_event) |
| 403 : ChannelProxy(new SyncContext(listener, ipc_message_loop, shutdown_event)), | 404 : ChannelProxy(new SyncContext(listener, ipc_message_loop, shutdown_event)), |
| 404 sync_messages_with_no_timeout_allowed_(true) { | 405 sync_messages_with_no_timeout_allowed_(true) { |
| 405 StartWatching(); | 406 StartWatching(); |
| 406 } | 407 } |
| 407 | 408 |
| 408 SyncChannel::~SyncChannel() { | 409 SyncChannel::~SyncChannel() { |
| 409 } | 410 } |
| 410 | 411 |
| 411 void SyncChannel::SetRestrictDispatchToSameChannel(bool value) { | 412 void SyncChannel::SetRestrictDispatchChannelGroup(int group) { |
| 412 sync_context()->set_restrict_dispatch(value); | 413 sync_context()->set_restrict_dispatch_group(group); |
| 413 } | 414 } |
| 414 | 415 |
| 415 bool SyncChannel::Send(Message* message) { | 416 bool SyncChannel::Send(Message* message) { |
| 416 return SendWithTimeout(message, base::kNoTimeout); | 417 return SendWithTimeout(message, base::kNoTimeout); |
| 417 } | 418 } |
| 418 | 419 |
| 419 bool SyncChannel::SendWithTimeout(Message* message, int timeout_ms) { | 420 bool SyncChannel::SendWithTimeout(Message* message, int timeout_ms) { |
| 420 if (!message->is_sync()) { | 421 if (!message->is_sync()) { |
| 421 ChannelProxy::Send(message); | 422 ChannelProxy::Send(message); |
| 422 return true; | 423 return true; |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 // Ideally we only want to watch this object when running a nested message | 532 // Ideally we only want to watch this object when running a nested message |
| 532 // loop. However, we don't know when it exits if there's another nested | 533 // loop. However, we don't know when it exits if there's another nested |
| 533 // message loop running under it or not, so we wouldn't know whether to | 534 // message loop running under it or not, so we wouldn't know whether to |
| 534 // stop or keep watching. So we always watch it, and create the event as | 535 // stop or keep watching. So we always watch it, and create the event as |
| 535 // manual reset since the object watcher might otherwise reset the event | 536 // manual reset since the object watcher might otherwise reset the event |
| 536 // when we're doing a WaitMany. | 537 // when we're doing a WaitMany. |
| 537 dispatch_watcher_.StartWatching(sync_context()->GetDispatchEvent(), this); | 538 dispatch_watcher_.StartWatching(sync_context()->GetDispatchEvent(), this); |
| 538 } | 539 } |
| 539 | 540 |
| 540 } // namespace IPC | 541 } // namespace IPC |
| OLD | NEW |