chromium/mojo/public/cpp/bindings/async_flusher.h

// Copyright 2020 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_ASYNC_FLUSHER_H_
#define MOJO_PUBLIC_CPP_BINDINGS_ASYNC_FLUSHER_H_

#include "base/component_export.h"
#include "mojo/public/cpp/system/message_pipe.h"

namespace mojo {

class PendingFlush;
class PipeControlMessageProxy;

// An object that can be consumed by |FlushAsync()| on a Remote or Receiver in
// order to perform an asynchronous flush operation on the object. Every
// AsyncFlusher is associated with a PendingFlush object which can be monitored
// or consumed to remotely observe completion of the corresponding flush
// operation.
//
// NOTE: Most commonly for asynchronous flush operations, |FlushAsync()| can
// be called on a Remote or Receiver with no arguments. This creates an
// AsyncFlusher/PendingFlush pair and immediately flushes the callee with the
// resulting AsyncFlusher. The entangled PendingFlush is returned for subsequent
// consumption.
//
// Direct use of AsyncFlusher (and in particular of the PendingFlush constructor
// which takes an AsyncFlusher* argument to initialize) is reserved for edge
// cases where a PendingFlush is needed before its corresponding flush operation
// can be initiated (e.g. when the interface to flush lives on a different
// thread from the interface that will wait on its PendingFlush).
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS) AsyncFlusher {};

}  // namespace mojo

#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASYNC_FLUSHER_H_