// 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_REMOTE_H_ #define MOJO_PUBLIC_CPP_BINDINGS_REMOTE_H_ #include <cstdint> #include <tuple> #include <utility> #include "base/check.h" #include "base/functional/callback_forward.h" #include "base/memory/scoped_refptr.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "mojo/public/cpp/bindings/async_flusher.h" #include "mojo/public/cpp/bindings/lib/interface_ptr_state.h" #include "mojo/public/cpp/bindings/pending_flush.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/runtime_features.h" #include "mojo/public/cpp/system/message_pipe.h" namespace mojo { // A Remote is used to issue Interface method calls to a single connected // Receiver or PendingReceiver. The Remote must be bound in order to issue those // method calls, and it becomes bound by consuming a PendingRemote either at // construction time or by calling |Bind()|. // // Remote is NOT thread- or sequence-safe and must be used on a single // (but otherwise arbitrary) sequence. All bound Remote objects are associated // with a base::SequenceTaskRunner which the Remote uses exclusively to schedule // response callbacks and disconnection notifications. // // The most common ways to bind a Remote are to consume a PendingRemote received // via some IPC, or to call |BindNewPipeAndPassReceiver()| and send the returned // PendingReceiver somewhere useful (i.e., to a remote Receiver who will consume // it). For example: // // mojo::Remote<mojom::Widget> widget; // widget_factory->CreateWidget(widget.BindNewPipeAndPassReceiver()); // widget->Click(); // // IMPORTANT: There are some things to be aware of regarding Interface method // calls as they relate to Remote object lifetime: // // - Interface method calls issued immediately before the destruction of a // Remote ARE guaranteed to be transmitted to the remote's receiver as long // as the receiver itself remains alive, either as a Receiver or a // PendingReceiver. // // - In the name of memory safety, Interface method response callbacks (and in // general ANY tasks which can be scheduled by a Remote) will NEVER // be dispatched beyond the lifetime of the Remote object. As such, if // you make a call and you need its reply, you must keep the Remote alive // until the reply is received. template <typename Interface> class Remote { … }; } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_REMOTE_H_