| // Copyright 2019 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_DEVELOPER_FORENSICS_FEEDBACK_ANNOTATIONS_TIME_PROVIDER_H_ |
| #define SRC_DEVELOPER_FORENSICS_FEEDBACK_ANNOTATIONS_TIME_PROVIDER_H_ |
| |
| #include <lib/async/cpp/wait.h> |
| #include <lib/zx/clock.h> |
| |
| #include <memory> |
| |
| #include "src/developer/forensics/feedback/annotations/provider.h" |
| #include "src/developer/forensics/feedback/annotations/types.h" |
| #include "src/lib/timekeeper/clock.h" |
| |
| namespace forensics::feedback { |
| |
| // Get the uptime of the device and the current UTC time. |
| class TimeProvider : public DynamicSyncAnnotationProvider { |
| public: |
| TimeProvider(async_dispatcher_t* dispatcher, zx::unowned_clock clock_handle, |
| std::unique_ptr<timekeeper::Clock> clock); |
| virtual ~TimeProvider() = default; |
| |
| static std::set<std::string> GetAnnotationKeys(); |
| std::set<std::string> GetKeys() const override; |
| |
| Annotations Get() override; |
| |
| private: |
| // Keep waiting on the clock handle until the clock has achieved logging quality. |
| void OnClockLoggingQuality(async_dispatcher_t* dispatcher, async::WaitBase* wait, |
| zx_status_t status, const zx_packet_signal_t* signal); |
| |
| std::unique_ptr<timekeeper::Clock> clock_; |
| bool is_utc_time_accurate_ = false; |
| async::WaitMethod<TimeProvider, &TimeProvider::OnClockLoggingQuality> |
| wait_for_logging_quality_clock_; |
| }; |
| |
| } // namespace forensics::feedback |
| |
| #endif // SRC_DEVELOPER_FORENSICS_FEEDBACK_ANNOTATIONS_TIME_PROVIDER_H_ |