// 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_ASSOCIATED_REMOTE_H_ #define MOJO_PUBLIC_CPP_BINDINGS_SHARED_ASSOCIATED_REMOTE_H_ #include <tuple> #include "base/memory/scoped_refptr.h" #include "base/task/sequenced_task_runner.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "mojo/public/cpp/bindings/runtime_features.h" #include "mojo/public/cpp/bindings/shared_remote.h" namespace mojo { namespace internal { SharedRemoteTraits<AssociatedRemote<Interface>>; } // namespace internal // SharedAssociatedRemote wraps a non-thread-safe AssociatedRemote and proxies // messages to it. Unlike normal AssociatedRemote objects, // SharedAssociatedRemote is copyable and usable from any thread, but has some // additional overhead and latency in message transmission as a trade-off. // // Async calls are posted to the sequence that the underlying AssociatedRemote // is bound to, and responses are posted back to the calling sequence. Sync // calls are dispatched directly if the call is made on the sequence that the // wrapped AssociatedRemote is bound to, or posted otherwise. It's important to // be aware that sync calls block both the calling sequence and the bound // AssociatedRemote's sequence. That means that you cannot make sync calls // through a SharedAssociatedRemote if the underlying AssociatedRemote is bound // to a sequence that cannot block, like the IPC thread. template <typename Interface> class SharedAssociatedRemote { … }; } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_SHARED_ASSOCIATED_REMOTE_H_