aboutsummaryrefslogtreecommitdiff
path: root/mojo/public/cpp/bindings/lib/multiplex_router.h
diff options
context:
space:
mode:
Diffstat (limited to 'mojo/public/cpp/bindings/lib/multiplex_router.h')
-rw-r--r--mojo/public/cpp/bindings/lib/multiplex_router.h275
1 files changed, 0 insertions, 275 deletions
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.h b/mojo/public/cpp/bindings/lib/multiplex_router.h
deleted file mode 100644
index cac138b..0000000
--- a/mojo/public/cpp/bindings/lib/multiplex_router.h
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
-
-#include <stdint.h>
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connector.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_handler.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_proxy.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace mojo {
-
-namespace internal {
-
-// MultiplexRouter supports routing messages for multiple interfaces over a
-// single message pipe.
-//
-// It is created on the thread where the master interface of the message pipe
-// lives. Although it is ref-counted, it is guarateed to be destructed on the
-// same thread.
-// Some public methods are only allowed to be called on the creating thread;
-// while the others are safe to call from any threads. Please see the method
-// comments for more details.
-//
-// NOTE: CloseMessagePipe() or PassMessagePipe() MUST be called on |runner|'s
-// thread before this object is destroyed.
-class MOJO_CPP_BINDINGS_EXPORT MultiplexRouter
- : NON_EXPORTED_BASE(public MessageReceiver),
- public AssociatedGroupController,
- NON_EXPORTED_BASE(public PipeControlMessageHandlerDelegate) {
- public:
- enum Config {
- // There is only the master interface running on this router. Please note
- // that because of interface versioning, the other side of the message pipe
- // may use a newer master interface definition which passes associated
- // interfaces. In that case, this router may still receive pipe control
- // messages or messages targetting associated interfaces.
- SINGLE_INTERFACE,
- // Similar to the mode above, there is only the master interface running on
- // this router. Besides, the master interface has sync methods.
- SINGLE_INTERFACE_WITH_SYNC_METHODS,
- // There may be associated interfaces running on this router.
- MULTI_INTERFACE
- };
-
- // If |set_interface_id_namespace_bit| is true, the interface IDs generated by
- // this router will have the highest bit set.
- MultiplexRouter(ScopedMessagePipeHandle message_pipe,
- Config config,
- bool set_interface_id_namespace_bit,
- scoped_refptr<base::SingleThreadTaskRunner> runner);
-
- // Sets the master interface name for this router. Only used when reporting
- // message header or control message validation errors.
- // |name| must be a string literal.
- void SetMasterInterfaceName(const char* name);
-
- // ---------------------------------------------------------------------------
- // The following public methods are safe to call from any threads.
-
- // AssociatedGroupController implementation:
- InterfaceId AssociateInterface(
- ScopedInterfaceEndpointHandle handle_to_send) override;
- ScopedInterfaceEndpointHandle CreateLocalEndpointHandle(
- InterfaceId id) override;
- void CloseEndpointHandle(
- InterfaceId id,
- const base::Optional<DisconnectReason>& reason) override;
- InterfaceEndpointController* AttachEndpointClient(
- const ScopedInterfaceEndpointHandle& handle,
- InterfaceEndpointClient* endpoint_client,
- scoped_refptr<base::SingleThreadTaskRunner> runner) override;
- void DetachEndpointClient(
- const ScopedInterfaceEndpointHandle& handle) override;
- void RaiseError() override;
-
- // ---------------------------------------------------------------------------
- // The following public methods are called on the creating thread.
-
- // Please note that this method shouldn't be called unless it results from an
- // explicit request of the user of bindings (e.g., the user sets an
- // InterfacePtr to null or closes a Binding).
- void CloseMessagePipe();
-
- // Extracts the underlying message pipe.
- ScopedMessagePipeHandle PassMessagePipe() {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!HasAssociatedEndpoints());
- return connector_.PassMessagePipe();
- }
-
- // Blocks the current thread until the first incoming message, or |deadline|.
- bool WaitForIncomingMessage(MojoDeadline deadline) {
- DCHECK(thread_checker_.CalledOnValidThread());
- return connector_.WaitForIncomingMessage(deadline);
- }
-
- // See Binding for details of pause/resume.
- void PauseIncomingMethodCallProcessing();
- void ResumeIncomingMethodCallProcessing();
-
- // Whether there are any associated interfaces running currently.
- bool HasAssociatedEndpoints() const;
-
- // Sets this object to testing mode.
- // In testing mode, the object doesn't disconnect the underlying message pipe
- // when it receives unexpected or invalid messages.
- void EnableTestingMode();
-
- // Is the router bound to a message pipe handle?
- bool is_valid() const {
- DCHECK(thread_checker_.CalledOnValidThread());
- return connector_.is_valid();
- }
-
- // TODO(yzshen): consider removing this getter.
- MessagePipeHandle handle() const {
- DCHECK(thread_checker_.CalledOnValidThread());
- return connector_.handle();
- }
-
- bool SimulateReceivingMessageForTesting(Message* message) {
- return filters_.Accept(message);
- }
-
- private:
- class InterfaceEndpoint;
- class MessageWrapper;
- struct Task;
-
- ~MultiplexRouter() override;
-
- // MessageReceiver implementation:
- bool Accept(Message* message) override;
-
- // PipeControlMessageHandlerDelegate implementation:
- bool OnPeerAssociatedEndpointClosed(
- InterfaceId id,
- const base::Optional<DisconnectReason>& reason) override;
-
- void OnPipeConnectionError();
-
- // Specifies whether we are allowed to directly call into
- // InterfaceEndpointClient (given that we are already on the same thread as
- // the client).
- enum ClientCallBehavior {
- // Don't call any InterfaceEndpointClient methods directly.
- NO_DIRECT_CLIENT_CALLS,
- // Only call InterfaceEndpointClient::HandleIncomingMessage directly to
- // handle sync messages.
- ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES,
- // Allow to call any InterfaceEndpointClient methods directly.
- ALLOW_DIRECT_CLIENT_CALLS
- };
-
- // Processes enqueued tasks (incoming messages and error notifications).
- // |current_task_runner| is only used when |client_call_behavior| is
- // ALLOW_DIRECT_CLIENT_CALLS to determine whether we are on the right task
- // runner to make client calls for async messages or connection error
- // notifications.
- //
- // Note: Because calling into InterfaceEndpointClient may lead to destruction
- // of this object, if direct calls are allowed, the caller needs to hold on to
- // a ref outside of |lock_| before calling this method.
- void ProcessTasks(ClientCallBehavior client_call_behavior,
- base::SingleThreadTaskRunner* current_task_runner);
-
- // Processes the first queued sync message for the endpoint corresponding to
- // |id|; returns whether there are more sync messages for that endpoint in the
- // queue.
- //
- // This method is only used by enpoints during sync watching. Therefore, not
- // all sync messages are handled by it.
- bool ProcessFirstSyncMessageForEndpoint(InterfaceId id);
-
- // Returns true to indicate that |task|/|message| has been processed.
- bool ProcessNotifyErrorTask(
- Task* task,
- ClientCallBehavior client_call_behavior,
- base::SingleThreadTaskRunner* current_task_runner);
- bool ProcessIncomingMessage(
- Message* message,
- ClientCallBehavior client_call_behavior,
- base::SingleThreadTaskRunner* current_task_runner);
-
- void MaybePostToProcessTasks(base::SingleThreadTaskRunner* task_runner);
- void LockAndCallProcessTasks();
-
- // Updates the state of |endpoint|. If both the endpoint and its peer have
- // been closed, removes it from |endpoints_|.
- // NOTE: The method may invalidate |endpoint|.
- enum EndpointStateUpdateType { ENDPOINT_CLOSED, PEER_ENDPOINT_CLOSED };
- void UpdateEndpointStateMayRemove(InterfaceEndpoint* endpoint,
- EndpointStateUpdateType type);
-
- void RaiseErrorInNonTestingMode();
-
- InterfaceEndpoint* FindOrInsertEndpoint(InterfaceId id, bool* inserted);
- InterfaceEndpoint* FindEndpoint(InterfaceId id);
-
- void AssertLockAcquired();
-
- // Whether to set the namespace bit when generating interface IDs. Please see
- // comments of kInterfaceIdNamespaceMask.
- const bool set_interface_id_namespace_bit_;
-
- scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
- // Owned by |filters_| below.
- MessageHeaderValidator* header_validator_;
-
- FilterChain filters_;
- Connector connector_;
-
- base::ThreadChecker thread_checker_;
-
- // Protects the following members.
- // Not set in Config::SINGLE_INTERFACE* mode.
- mutable base::Optional<base::Lock> lock_;
- PipeControlMessageHandler control_message_handler_;
-
- // NOTE: It is unsafe to call into this object while holding |lock_|.
- PipeControlMessageProxy control_message_proxy_;
-
- std::map<InterfaceId, scoped_refptr<InterfaceEndpoint>> endpoints_;
- uint32_t next_interface_id_value_;
-
- std::deque<std::unique_ptr<Task>> tasks_;
- // It refers to tasks in |tasks_| and doesn't own any of them.
- std::map<InterfaceId, std::deque<Task*>> sync_message_tasks_;
-
- bool posted_to_process_tasks_;
- scoped_refptr<base::SingleThreadTaskRunner> posted_to_task_runner_;
-
- bool encountered_error_;
-
- bool paused_;
-
- bool testing_mode_;
-
- DISALLOW_COPY_AND_ASSIGN(MultiplexRouter);
-};
-
-} // namespace internal
-} // namespace mojo
-
-#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_