| // Copyright 2022 The Fuchsia 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 SRC_LIB_METRICS_BUFFER_METRICS_IMPL_H_ |
| #define SRC_LIB_METRICS_BUFFER_METRICS_IMPL_H_ |
| |
| #include <fidl/fuchsia.io/cpp/fidl.h> |
| #include <fidl/fuchsia.metrics/cpp/fidl.h> |
| |
| namespace cobalt { |
| |
| // This class connects to the MetricsEventLoggerFactory and MetricsEventLogger fidl endpoints, and |
| // will re-connect starting with the fuchsia.io.Directory if an error occurs. The failing call is |
| // not retried. |
| class MetricsImpl { |
| public: |
| // called on dispatcher thread |
| explicit MetricsImpl(async_dispatcher_t* dispatcher, |
| fidl::ClientEnd<fuchsia_io::Directory> directory, uint32_t project_id); |
| // This is called on the dispatcher thread, with guarantee that anything queued to the dispatcher |
| // during LogMetricEvents will run before ~MetricsImpl. |
| ~MetricsImpl() = default; |
| |
| // This is called on an arbitrary thread which is not the dispatcher thread, with guarantee that |
| // ~MetricsImpl will be queued to the dispatcher after anything queued to the dispatcher by this |
| // call. |
| void LogMetricEvents(std::vector<fuchsia_metrics::MetricEvent> events); |
| |
| private: |
| const uint32_t project_id_ = 0; |
| async_dispatcher_t* dispatcher_ = nullptr; |
| |
| fidl::ClientEnd<fuchsia_io::Directory> directory_; |
| |
| // These are wrapped in std::optional<> because destruction is (as of this comment) the only way |
| // to unbind even if there's an async response in flight. |
| std::optional<fidl::Client<fuchsia_metrics::MetricEventLoggerFactory>> logger_factory_; |
| std::optional<fidl::Client<fuchsia_metrics::MetricEventLogger>> logger_; |
| |
| // called on dispatcher thread |
| bool EnsureConnected(); |
| // called on dispatcher thread |
| void Connect(); |
| }; |
| |
| } // namespace cobalt |
| |
| #endif // SRC_LIB_METRICS_BUFFER_METRICS_IMPL_H_ |