// Copyright 2019 The Chromium Authors // 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_SHARED_REMOTE_H_ #define MOJO_PUBLIC_CPP_BINDINGS_SHARED_REMOTE_H_ #include <memory> #include <tuple> #include "base/functional/bind.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/synchronization/waitable_event.h" #include "base/task/sequenced_task_runner.h" #include "base/task/sequenced_task_runner_helpers.h" #include "base/task/task_runner.h" #include "mojo/public/cpp/bindings/associated_group.h" #include "mojo/public/cpp/bindings/lib/thread_safe_forwarder_base.h" #include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/runtime_features.h" namespace mojo { namespace internal { template <typename RemoteType> struct SharedRemoteTraits; SharedRemoteTraits<Remote<Interface>>; } // namespace internal // Helper that may be used from any sequence to serialize |Interface| messages // and forward them elsewhere. In general, prefer `SharedRemote`, but this type // may be useful when it's necessary to manually manage the lifetime of the // underlying proxy object which will be used to ultimately send messages. template <typename Interface> class ThreadSafeForwarder : public internal::ThreadSafeForwarderBase { … }; template <typename Interface> class SharedRemote; template <typename RemoteType> class SharedRemoteBase : public base::RefCountedThreadSafe<SharedRemoteBase<RemoteType>> { … }; // SharedRemote wraps a non-thread-safe Remote and proxies messages to it. Note // that SharedRemote itself is also NOT THREAD-SAFE, but unlike Remote it IS // copyable cross-thread, and each copy is usable from its own thread. The // trade-off compared to a Remote is some additional overhead and latency in // message transmission, as sending a message usually incurs a task hop. // // Async calls are posted to the bound sequence (the sequence that the // underlying Remote is bound to, i.e. |bind_task_runner| below), and responses // are posted back to the calling sequence. Sync calls are dispatched directly // if the call is made on the bound sequence, or posted otherwise. // // This means that in general, when making calls from sequences other than the // bound sequence, a hop is first made *to* the bound sequence; and when // receiving replies, a hop is made *from* the bound the sequence. // // Note that sync calls only block the calling sequence. template <typename Interface> class SharedRemote { … }; } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_SHARED_REMOTE_H_