| 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 |