Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/metrics/src/sys/windows/gpu_metrics.rs
5394 views
1
// Copyright 2022 The ChromiumOS Authors
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
use std::sync::atomic::AtomicBool;
6
use std::sync::atomic::Ordering;
7
use std::sync::Arc;
8
9
use crate::sys::system_metrics::CoreWinMetrics;
10
use crate::sys::windows::Error;
11
use crate::sys::windows::Result;
12
13
static INSTANCE_EXISTS: AtomicBool = AtomicBool::new(false);
14
15
/// Used by gpu_display to show metrics in the crosvm performance overlay.
16
pub struct Metrics {
17
metrics: Vec<Box<dyn ToString + Send + Sync>>,
18
// more_metrics is for metrics which have multiple owners (e.g., device dependent).
19
more_metrics: Vec<Arc<dyn ToString + Send + Sync>>,
20
}
21
22
impl Metrics {
23
pub fn new() -> Result<Self> {
24
if INSTANCE_EXISTS
25
.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
26
.is_err()
27
{
28
return Err(Error::InstanceAlreadyExists);
29
}
30
Ok(Metrics {
31
metrics: vec![
32
#[cfg(windows)]
33
Box::new(CoreWinMetrics::new()?),
34
],
35
more_metrics: vec![],
36
})
37
}
38
39
pub fn add_gpu_metrics(&mut self, t: Arc<dyn ToString + Send + Sync>) {
40
self.more_metrics.push(t);
41
}
42
43
pub fn get_metric_string(&self) -> String {
44
let mut buf = String::new();
45
for collector in self.metrics.iter() {
46
buf.push_str(&collector.to_string());
47
buf.push('\n');
48
}
49
for collector in self.more_metrics.iter() {
50
buf.push_str(&collector.to_string());
51
buf.push('\n');
52
}
53
buf
54
}
55
}
56
57