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/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 // message loops complete correctly. | 222 // message loops complete correctly. |
223 base::WaitableEventWatcher* top_send_done_watcher_; | 223 base::WaitableEventWatcher* top_send_done_watcher_; |
224 }; | 224 }; |
225 | 225 |
226 base::LazyInstance<base::ThreadLocalPointer<SyncChannel::ReceivedSyncMsgQueue> > | 226 base::LazyInstance<base::ThreadLocalPointer<SyncChannel::ReceivedSyncMsgQueue> > |
227 SyncChannel::ReceivedSyncMsgQueue::lazy_tls_ptr_ = | 227 SyncChannel::ReceivedSyncMsgQueue::lazy_tls_ptr_ = |
228 LAZY_INSTANCE_INITIALIZER; | 228 LAZY_INSTANCE_INITIALIZER; |
229 | 229 |
230 SyncChannel::SyncContext::SyncContext( | 230 SyncChannel::SyncContext::SyncContext( |
231 Listener* listener, | 231 Listener* listener, |
232 base::SingleThreadTaskRunner* ipc_task_runner, | 232 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner, |
233 WaitableEvent* shutdown_event) | 233 WaitableEvent* shutdown_event) |
234 : ChannelProxy::Context(listener, ipc_task_runner), | 234 : ChannelProxy::Context(listener, ipc_task_runner), |
235 received_sync_msgs_(ReceivedSyncMsgQueue::AddContext()), | 235 received_sync_msgs_(ReceivedSyncMsgQueue::AddContext()), |
236 shutdown_event_(shutdown_event), | 236 shutdown_event_(shutdown_event), |
237 restrict_dispatch_group_(kRestrictDispatchGroup_None) { | 237 restrict_dispatch_group_(kRestrictDispatchGroup_None) { |
238 } | 238 } |
239 | 239 |
240 SyncChannel::SyncContext::~SyncContext() { | 240 SyncChannel::SyncContext::~SyncContext() { |
241 while (!deserializers_.empty()) | 241 while (!deserializers_.empty()) |
242 Pop(); | 242 Pop(); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 base::WaitableEventWatcher::EventCallback | 403 base::WaitableEventWatcher::EventCallback |
404 SyncChannel::SyncContext::MakeWaitableEventCallback() { | 404 SyncChannel::SyncContext::MakeWaitableEventCallback() { |
405 return base::Bind(&SyncChannel::SyncContext::OnWaitableEventSignaled, this); | 405 return base::Bind(&SyncChannel::SyncContext::OnWaitableEventSignaled, this); |
406 } | 406 } |
407 | 407 |
408 // static | 408 // static |
409 scoped_ptr<SyncChannel> SyncChannel::Create( | 409 scoped_ptr<SyncChannel> SyncChannel::Create( |
410 const IPC::ChannelHandle& channel_handle, | 410 const IPC::ChannelHandle& channel_handle, |
411 Channel::Mode mode, | 411 Channel::Mode mode, |
412 Listener* listener, | 412 Listener* listener, |
413 base::SingleThreadTaskRunner* ipc_task_runner, | 413 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner, |
414 bool create_pipe_now, | 414 bool create_pipe_now, |
415 base::WaitableEvent* shutdown_event) { | 415 base::WaitableEvent* shutdown_event) { |
416 scoped_ptr<SyncChannel> channel = | 416 scoped_ptr<SyncChannel> channel = |
417 Create(listener, ipc_task_runner, shutdown_event); | 417 Create(listener, ipc_task_runner, shutdown_event); |
418 channel->Init(channel_handle, mode, create_pipe_now); | 418 channel->Init(channel_handle, mode, create_pipe_now); |
419 return channel.Pass(); | 419 return channel.Pass(); |
420 } | 420 } |
421 | 421 |
422 // static | 422 // static |
423 scoped_ptr<SyncChannel> SyncChannel::Create( | 423 scoped_ptr<SyncChannel> SyncChannel::Create( |
424 scoped_ptr<ChannelFactory> factory, | 424 scoped_ptr<ChannelFactory> factory, |
425 Listener* listener, | 425 Listener* listener, |
426 base::SingleThreadTaskRunner* ipc_task_runner, | 426 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner, |
427 bool create_pipe_now, | 427 bool create_pipe_now, |
428 base::WaitableEvent* shutdown_event) { | 428 base::WaitableEvent* shutdown_event) { |
429 scoped_ptr<SyncChannel> channel = | 429 scoped_ptr<SyncChannel> channel = |
430 Create(listener, ipc_task_runner, shutdown_event); | 430 Create(listener, ipc_task_runner, shutdown_event); |
431 channel->Init(factory.Pass(), create_pipe_now); | 431 channel->Init(factory.Pass(), create_pipe_now); |
432 return channel.Pass(); | 432 return channel.Pass(); |
433 } | 433 } |
434 | 434 |
435 // static | 435 // static |
436 scoped_ptr<SyncChannel> SyncChannel::Create( | 436 scoped_ptr<SyncChannel> SyncChannel::Create( |
437 Listener* listener, | 437 Listener* listener, |
438 base::SingleThreadTaskRunner* ipc_task_runner, | 438 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner, |
439 WaitableEvent* shutdown_event) { | 439 WaitableEvent* shutdown_event) { |
440 return make_scoped_ptr( | 440 return make_scoped_ptr( |
441 new SyncChannel(listener, ipc_task_runner, shutdown_event)); | 441 new SyncChannel(listener, ipc_task_runner, shutdown_event)); |
442 } | 442 } |
443 | 443 |
444 SyncChannel::SyncChannel( | 444 SyncChannel::SyncChannel( |
445 Listener* listener, | 445 Listener* listener, |
446 base::SingleThreadTaskRunner* ipc_task_runner, | 446 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner, |
447 WaitableEvent* shutdown_event) | 447 WaitableEvent* shutdown_event) |
448 : ChannelProxy(new SyncContext(listener, ipc_task_runner, shutdown_event)) { | 448 : ChannelProxy(new SyncContext(listener, ipc_task_runner, shutdown_event)) { |
449 // The current (listener) thread must be distinct from the IPC thread, or else | 449 // The current (listener) thread must be distinct from the IPC thread, or else |
450 // sending synchronous messages will deadlock. | 450 // sending synchronous messages will deadlock. |
451 DCHECK_NE(ipc_task_runner, base::ThreadTaskRunnerHandle::Get().get()); | 451 DCHECK_NE(ipc_task_runner, base::ThreadTaskRunnerHandle::Get().get()); |
452 StartWatching(); | 452 StartWatching(); |
453 } | 453 } |
454 | 454 |
455 SyncChannel::~SyncChannel() { | 455 SyncChannel::~SyncChannel() { |
456 } | 456 } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 // manual reset since the object watcher might otherwise reset the event | 578 // manual reset since the object watcher might otherwise reset the event |
579 // when we're doing a WaitMany. | 579 // when we're doing a WaitMany. |
580 dispatch_watcher_callback_ = | 580 dispatch_watcher_callback_ = |
581 base::Bind(&SyncChannel::OnWaitableEventSignaled, | 581 base::Bind(&SyncChannel::OnWaitableEventSignaled, |
582 base::Unretained(this)); | 582 base::Unretained(this)); |
583 dispatch_watcher_.StartWatching(sync_context()->GetDispatchEvent(), | 583 dispatch_watcher_.StartWatching(sync_context()->GetDispatchEvent(), |
584 dispatch_watcher_callback_); | 584 dispatch_watcher_callback_); |
585 } | 585 } |
586 | 586 |
587 } // namespace IPC | 587 } // namespace IPC |
OLD | NEW |