OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_mojo_bootstrap.h" | 5 #include "ipc/ipc_mojo_bootstrap.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <memory> | 10 #include <memory> |
11 #include <queue> | 11 #include <queue> |
12 #include <utility> | 12 #include <utility> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/callback.h" | 15 #include "base/callback.h" |
16 #include "base/logging.h" | 16 #include "base/logging.h" |
17 #include "base/macros.h" | 17 #include "base/macros.h" |
18 #include "base/memory/ptr_util.h" | 18 #include "base/memory/ptr_util.h" |
19 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
20 #include "base/synchronization/lock.h" | 20 #include "base/synchronization/lock.h" |
21 #include "base/threading/thread_task_runner_handle.h" | 21 #include "base/threading/thread_task_runner_handle.h" |
22 #include "ipc/mojo_event.h" | |
23 #include "mojo/public/cpp/bindings/associated_group.h" | 22 #include "mojo/public/cpp/bindings/associated_group.h" |
24 #include "mojo/public/cpp/bindings/associated_group_controller.h" | 23 #include "mojo/public/cpp/bindings/associated_group_controller.h" |
25 #include "mojo/public/cpp/bindings/connector.h" | 24 #include "mojo/public/cpp/bindings/connector.h" |
26 #include "mojo/public/cpp/bindings/interface_endpoint_client.h" | 25 #include "mojo/public/cpp/bindings/interface_endpoint_client.h" |
27 #include "mojo/public/cpp/bindings/interface_endpoint_controller.h" | 26 #include "mojo/public/cpp/bindings/interface_endpoint_controller.h" |
28 #include "mojo/public/cpp/bindings/interface_id.h" | 27 #include "mojo/public/cpp/bindings/interface_id.h" |
29 #include "mojo/public/cpp/bindings/message.h" | 28 #include "mojo/public/cpp/bindings/message.h" |
30 #include "mojo/public/cpp/bindings/message_header_validator.h" | 29 #include "mojo/public/cpp/bindings/message_header_validator.h" |
31 #include "mojo/public/cpp/bindings/pipe_control_message_handler.h" | 30 #include "mojo/public/cpp/bindings/pipe_control_message_handler.h" |
32 #include "mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h" | 31 #include "mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h" |
33 #include "mojo/public/cpp/bindings/pipe_control_message_proxy.h" | 32 #include "mojo/public/cpp/bindings/pipe_control_message_proxy.h" |
34 #include "mojo/public/cpp/bindings/sync_handle_watcher.h" | 33 #include "mojo/public/cpp/bindings/sync_event_watcher.h" |
35 | 34 |
36 namespace IPC { | 35 namespace IPC { |
37 | 36 |
38 namespace { | 37 namespace { |
39 | 38 |
40 class ChannelAssociatedGroupController | 39 class ChannelAssociatedGroupController |
41 : public mojo::AssociatedGroupController, | 40 : public mojo::AssociatedGroupController, |
42 public mojo::MessageReceiver, | 41 public mojo::MessageReceiver, |
43 public mojo::PipeControlMessageHandlerDelegate { | 42 public mojo::PipeControlMessageHandlerDelegate { |
44 public: | 43 public: |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 friend class base::RefCountedThreadSafe<Endpoint>; | 428 friend class base::RefCountedThreadSafe<Endpoint>; |
430 | 429 |
431 ~Endpoint() override { | 430 ~Endpoint() override { |
432 controller_->lock_.AssertAcquired(); | 431 controller_->lock_.AssertAcquired(); |
433 DCHECK(!client_); | 432 DCHECK(!client_); |
434 DCHECK(closed_); | 433 DCHECK(closed_); |
435 DCHECK(peer_closed_); | 434 DCHECK(peer_closed_); |
436 DCHECK(!sync_watcher_); | 435 DCHECK(!sync_watcher_); |
437 } | 436 } |
438 | 437 |
439 void OnSyncMessageEventHandleReady(MojoResult result) { | 438 void OnSyncMessageEventReady() { |
440 DCHECK(task_runner_->BelongsToCurrentThread()); | 439 DCHECK(task_runner_->BelongsToCurrentThread()); |
441 | 440 |
442 scoped_refptr<Endpoint> keepalive(this); | 441 scoped_refptr<Endpoint> keepalive(this); |
443 scoped_refptr<AssociatedGroupController> controller_keepalive( | 442 scoped_refptr<AssociatedGroupController> controller_keepalive( |
444 controller_); | 443 controller_); |
445 | 444 |
446 bool reset_sync_watcher = false; | 445 bool reset_sync_watcher = false; |
447 { | 446 { |
448 base::AutoLock locker(controller_->lock_); | 447 base::AutoLock locker(controller_->lock_); |
449 bool more_to_process = false; | 448 bool more_to_process = false; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 } | 483 } |
485 | 484 |
486 void EnsureSyncWatcherExists() { | 485 void EnsureSyncWatcherExists() { |
487 DCHECK(task_runner_->BelongsToCurrentThread()); | 486 DCHECK(task_runner_->BelongsToCurrentThread()); |
488 if (sync_watcher_) | 487 if (sync_watcher_) |
489 return; | 488 return; |
490 | 489 |
491 { | 490 { |
492 base::AutoLock locker(controller_->lock_); | 491 base::AutoLock locker(controller_->lock_); |
493 if (!sync_message_event_) { | 492 if (!sync_message_event_) { |
494 sync_message_event_.reset(new MojoEvent); | 493 sync_message_event_ = base::MakeUnique<base::WaitableEvent>( |
| 494 base::WaitableEvent::ResetPolicy::MANUAL, |
| 495 base::WaitableEvent::InitialState::NOT_SIGNALED); |
495 if (peer_closed_ || !sync_messages_.empty()) | 496 if (peer_closed_ || !sync_messages_.empty()) |
496 SignalSyncMessageEvent(); | 497 SignalSyncMessageEvent(); |
497 } | 498 } |
498 } | 499 } |
499 | 500 |
500 sync_watcher_.reset(new mojo::SyncHandleWatcher( | 501 sync_watcher_ = base::MakeUnique<mojo::SyncEventWatcher>( |
501 sync_message_event_->GetHandle(), MOJO_HANDLE_SIGNAL_READABLE, | 502 sync_message_event_.get(), |
502 base::Bind(&Endpoint::OnSyncMessageEventHandleReady, | 503 base::Bind(&Endpoint::OnSyncMessageEventReady, |
503 base::Unretained(this)))); | 504 base::Unretained(this))); |
504 } | |
505 | |
506 void EnsureSyncMessageEventExists() { | |
507 controller_->lock_.AssertAcquired(); | |
508 if (!sync_message_event_) | |
509 sync_message_event_.reset(new MojoEvent); | |
510 } | 505 } |
511 | 506 |
512 uint32_t GenerateSyncMessageId() { | 507 uint32_t GenerateSyncMessageId() { |
513 // Overflow is fine. | 508 // Overflow is fine. |
514 uint32_t id = next_sync_message_id_++; | 509 uint32_t id = next_sync_message_id_++; |
515 DCHECK(sync_messages_.empty() || sync_messages_.front().first != id); | 510 DCHECK(sync_messages_.empty() || sync_messages_.front().first != id); |
516 return id; | 511 return id; |
517 } | 512 } |
518 | 513 |
519 ChannelAssociatedGroupController* const controller_; | 514 ChannelAssociatedGroupController* const controller_; |
520 const mojo::InterfaceId id_; | 515 const mojo::InterfaceId id_; |
521 | 516 |
522 bool closed_ = false; | 517 bool closed_ = false; |
523 bool peer_closed_ = false; | 518 bool peer_closed_ = false; |
524 bool handle_created_ = false; | 519 bool handle_created_ = false; |
525 base::Optional<mojo::DisconnectReason> disconnect_reason_; | 520 base::Optional<mojo::DisconnectReason> disconnect_reason_; |
526 mojo::InterfaceEndpointClient* client_ = nullptr; | 521 mojo::InterfaceEndpointClient* client_ = nullptr; |
527 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 522 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
528 std::unique_ptr<mojo::SyncHandleWatcher> sync_watcher_; | 523 std::unique_ptr<mojo::SyncEventWatcher> sync_watcher_; |
529 std::unique_ptr<MojoEvent> sync_message_event_; | 524 std::unique_ptr<base::WaitableEvent> sync_message_event_; |
530 std::queue<std::pair<uint32_t, MessageWrapper>> sync_messages_; | 525 std::queue<std::pair<uint32_t, MessageWrapper>> sync_messages_; |
531 uint32_t next_sync_message_id_ = 0; | 526 uint32_t next_sync_message_id_ = 0; |
532 | 527 |
533 DISALLOW_COPY_AND_ASSIGN(Endpoint); | 528 DISALLOW_COPY_AND_ASSIGN(Endpoint); |
534 }; | 529 }; |
535 | 530 |
536 class ControlMessageProxyThunk : public MessageReceiver { | 531 class ControlMessageProxyThunk : public MessageReceiver { |
537 public: | 532 public: |
538 explicit ControlMessageProxyThunk( | 533 explicit ControlMessageProxyThunk( |
539 ChannelAssociatedGroupController* controller) | 534 ChannelAssociatedGroupController* controller) |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
920 std::unique_ptr<MojoBootstrap> MojoBootstrap::Create( | 915 std::unique_ptr<MojoBootstrap> MojoBootstrap::Create( |
921 mojo::ScopedMessagePipeHandle handle, | 916 mojo::ScopedMessagePipeHandle handle, |
922 Channel::Mode mode, | 917 Channel::Mode mode, |
923 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) { | 918 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) { |
924 return base::MakeUnique<MojoBootstrapImpl>( | 919 return base::MakeUnique<MojoBootstrapImpl>( |
925 std::move(handle), new ChannelAssociatedGroupController( | 920 std::move(handle), new ChannelAssociatedGroupController( |
926 mode == Channel::MODE_SERVER, ipc_task_runner)); | 921 mode == Channel::MODE_SERVER, ipc_task_runner)); |
927 } | 922 } |
928 | 923 |
929 } // namespace IPC | 924 } // namespace IPC |
OLD | NEW |