Ctrl K
ComunidadGuías…

server/src/host_stats.cpp

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * @file src/host_stats.cpp
 * @brief Production adapter for the platform-neutral host statistics service.
 */
#include "host_stats.h"

#include "config.h"
#include "host_stats_service.h"
#include "logging.h"

#include <algorithm>
#include <chrono>
#include <memory>
#include <mutex>
#include <string_view>

namespace host_stats {
  namespace {
    std::mutex streaming_mutex;
    std::size_t rtsp_sessions = 0;
    std::size_t webrtc_sessions = 0;

    class deinit_t: public platf::deinit_t {
    public:
      explicit deinit_t(std::unique_ptr<service_t::guard_t> guard):
          _guard(std::move(guard)) {}

    private:
      std::unique_ptr<service_t::guard_t> _guard;
    };

    service_t &service() {
      static service_t instance {
        [] {
          return platf::create_host_stats_provider();
        },
        [] {
          return config::sunshine.realtime_stats_enabled;
        },
        [] {
          if (!config::sunshine.realtime_stats_enabled) {
            return std::chrono::milliseconds(2000);
          }
          return std::chrono::milliseconds(std::clamp(config::sunshine.realtime_stats_poll_interval_ms, 250, 60000));
        },
        [](std::string_view message) {
          BOOST_LOG(warning) << "host_stats: " << message;
        },
        [] {
          const auto interval = std::chrono::milliseconds(
            std::clamp(config::sunshine.realtime_stats_poll_interval_ms, 250, 60000)
          );
          return std::max(std::chrono::milliseconds(std::chrono::seconds(12)), interval + std::chrono::seconds(2));
        }
      };
      return instance;
    }

    void update_streaming_demand() {
      service().set_streaming(rtsp_sessions > 0 || webrtc_sessions > 0);
    }
  }  // namespace

  std::unique_ptr<platf::deinit_t> start() {
    auto guard = service().start();
    if (!guard) {
      return {};
    }
    return std::make_unique<deinit_t>(std::move(guard));
  }

  platf::host_stats_t latest() {
    return service().latest();
  }

  platf::host_stats_t latest_for_consumer() {
    return service().latest_for_consumer();
  }

  const platf::host_info_t &info() {
    return service().info();
  }

  void rtsp_session_started() {
    const std::lock_guard lock(streaming_mutex);
    ++rtsp_sessions;
    update_streaming_demand();
  }

  void rtsp_session_ended() {
    const std::lock_guard lock(streaming_mutex);
    if (rtsp_sessions > 0) {
      --rtsp_sessions;
    }
    update_streaming_demand();
  }

  void webrtc_session_started() {
    const std::lock_guard lock(streaming_mutex);
    ++webrtc_sessions;
    update_streaming_demand();
  }

  void webrtc_session_ended() {
    const std::lock_guard lock(streaming_mutex);
    if (webrtc_sessions > 0) {
      --webrtc_sessions;
    }
    update_streaming_demand();
  }

  void configuration_changed() {
    service().configuration_changed();
  }

#ifdef SUNSHINE_TESTS
  bool is_running_for_tests() {
    return service().is_running();
  }
#endif
}  // namespace host_stats