// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DIAGNOSTICS_GRPC_ASYNC_ADAPTER_GRPC_COMPLETION_QUEUE_DISPATCHER_H_
#define DIAGNOSTICS_GRPC_ASYNC_ADAPTER_GRPC_COMPLETION_QUEUE_DISPATCHER_H_

#include <map>
#include <memory>

#include <base/callback.h>
#include <base/macros.h>
#include <base/memory/ref_counted.h>
#include <base/sequence_checker.h>
#include <base/threading/simple_thread.h>

namespace base {
class SequencedTaskRunner;
}

namespace grpc {
class CompletionQueue;
}

namespace diagnostics {
namespace internal {
class MonitoringThreadDelegate;
}

// A GrpcCompletionQueueDispatcher monitors a grpc |CompletionQueue| for
// signalled events and posts tasks to a |SequencedTaskRunner| as a result.
// It uses a background thread to block on the |CompletionQueue|'s next event in
// a loop because this is a blocking operation.
// The |GrpcCompletionQueueDispatcher| may be constructed from anywhere, but its
// public methods should only be called on the same task runner that was passed
// to its constructor.
// This class assumes that every tag that is received from the |CompletionQueue|
// is expected, i.e. that |RegisterTag| has been called for every tag.
class GrpcCompletionQueueDispatcher {
 public:
  // Callbacks of this type will be called on the task runner passed
  // to the constructor when an expected event is available on the monitored
  // |CompletionQueue|. |ok| has an operation-specific meaning, see grpc's
  // |CompletionQueue::Next| documentation for details.
  using TagAvailableCallback = base::Callback<void(bool ok)>;

  // The constructed object will monitor |completion_queue| and post tasks to
  // |task_runner|. Note that the |GrpcCompletionQueueDispatcher| only
  // starts monitoring the |completion_queue| when |Start| is called.
  // |completion_queue| should outlive this object.
  GrpcCompletionQueueDispatcher(
      grpc::CompletionQueue* completion_queue,
      scoped_refptr<base::SequencedTaskRunner> task_runner);

  // Note that the destructor CHECKs that this instance has been shut down
  // properly using |Shutdown|.
  ~GrpcCompletionQueueDispatcher();

  // Starts the background thread and consequently starts monitoring the
  // |CompletionQueue| passed to the constructor.
  void Start();

  // Triggers shutting down the |CompletionQueue| and this
  // |GrpcCompletionQueueDispatcher|.
  // |on_shutdown_callback| will be called when the |CompletionQueue| is fully
  // drained and background thread has shut down. Only then may this instance be
  // destroyed.
  void Shutdown(base::Closure on_shutdown_callback);

  // Starts waiting for an event with |tag|. If |tag| has been or will be sent
  // (through RPC operations or alarms) to the CompletionQueue, |callback| is
  // guaranteed to be called exactly once on the task runner  passed to the
  // constructor. The reason is that the CompletionQueue itself guarantees that
  // every tag sent to the completion queue will be delivered out of the
  // completion queue. |GrpcCompletionQueueDispatcher| additionally guarantees
  // that if |callback| is never called (because |tag| was not sent to the
  // |CompletionQueue|), |callback| will be destroyed on shutdown on the
  // |TaskRunner| passed to the constructor.
  void RegisterTag(const void* tag, TagAvailableCallback callback);

  // Returns the monitored |CompletionQueue|.
  grpc::CompletionQueue* completion_queue() { return completion_queue_; }

 private:
  // This is called on the |task_runner_| when |tag| has been delivered out of
  // the |completion_queue_|.
  void OnTagAvailable(const void* tag, bool ok);

  // This is called on the |task_runner_| when the background thread is shutting
  // down because the |completion_queue_| has no more events.
  void OnShutdown();

  // The |CompletionQueue| that this object is monitoring.
  // Not owned.
  grpc::CompletionQueue* const completion_queue_;
  // The |SequencedTaskRunner| this object is posting tasks to.
  scoped_refptr<base::SequencedTaskRunner> task_runner_;

  // The delegate which will be executed on the |monitoring_thread|.
  std::unique_ptr<internal::MonitoringThreadDelegate>
      monitoring_thread_delegate_;
  // The background thread monitoring the |completion_queue_| and posting tasks
  // back on the task runner.
  std::unique_ptr<base::DelegateSimpleThread> monitoring_thread_;

  // This callback will be invoked when the moniting thread is exiting.
  base::Closure on_shutdown_callback_;
  // Maps tags to the callbacks that should be run on the |task_runner_| when
  // the corresponding event fires.
  std::map<const void*, TagAvailableCallback> tag_to_callback_map_;

  base::SequenceChecker sequence_checker_;

  DISALLOW_COPY_AND_ASSIGN(GrpcCompletionQueueDispatcher);
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_GRPC_ASYNC_ADAPTER_GRPC_COMPLETION_QUEUE_DISPATCHER_H_
