blob: 20e46695c749872d211fdf58c85f1e247ef70ec4 [file] [log] [blame]
// 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 {
public:
AsyncFlusher();
AsyncFlusher(AsyncFlusher&&);
AsyncFlusher(const AsyncFlusher&) = delete;
AsyncFlusher& operator=(AsyncFlusher&&);
AsyncFlusher& operator=(const AsyncFlusher&) = delete;
~AsyncFlusher();
private:
friend class PendingFlush;
friend class PipeControlMessageProxy;
void SetPipe(ScopedMessagePipeHandle pipe);
ScopedMessagePipeHandle PassPipe();
ScopedMessagePipeHandle pipe_;
};
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_BINDINGS_ASYNC_FLUSHER_H_