// Copyright (c) 2020 The Chromium 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 QUICHE_QUIC_QBONE_BONNET_QBONE_TUNNEL_SILO_H_
#define QUICHE_QUIC_QBONE_BONNET_QBONE_TUNNEL_SILO_H_

#include "absl/synchronization/notification.h"
#include "quic/platform/api/quic_thread.h"
#include "quic/qbone/bonnet/qbone_tunnel_interface.h"

namespace quic {

// QboneTunnelSilo is a thread that initializes and evaluates a QboneTunnel's
// event loop.
class QboneTunnelSilo : public QuicThread {
 public:
  // Does not take ownership of |tunnel|
  explicit QboneTunnelSilo(QboneTunnelInterface* tunnel, bool only_setup_tun)
      : QuicThread("QboneTunnelSilo"),
        tunnel_(tunnel),
        only_setup_tun_(only_setup_tun) {}

  QboneTunnelSilo(const QboneTunnelSilo&) = delete;
  QboneTunnelSilo& operator=(const QboneTunnelSilo&) = delete;

  QboneTunnelSilo(QboneTunnelSilo&&) = delete;
  QboneTunnelSilo& operator=(QboneTunnelSilo&&) = delete;

  // Terminates the tunnel's event loop. This silo must still be joined.
  void Quit();

 protected:
  void Run() override;

 private:
  bool ShouldRun();

  QboneTunnelInterface* tunnel_;

  absl::Notification quitting_;

  const bool only_setup_tun_;
};

}  // namespace quic

#endif  // QUICHE_QUIC_QBONE_BONNET_QBONE_TUNNEL_SILO_H_
