1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//! macmon - Sudoless performance monitoring library for Apple Silicon processors
//!
//! This library provides access to hardware metrics from Apple Silicon processors,
//! including CPU/GPU frequencies, power consumption, temperatures, and memory usage.
//!
//! # Examples
//!
//! [`Sampler::get_metrics`] blocks the current thread while macmon collects
//! metrics over the requested interval:
//!
//! ```no_run
//! use macmon::Sampler;
//!
//! fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let mut sampler = Sampler::new()?;
//!
//! loop {
//! let metrics = sampler.get_metrics(1000)?;
//!
//! println!("CPU power: {:.2} W", metrics.cpu_power);
//! println!("GPU power: {:.2} W", metrics.gpu_power);
//! println!("CPU frequency-scaled ratio: {:.1}%", metrics.cpu_scaled_ratio * 100.0);
//! println!("CPU active residency: {:.1}%", metrics.cpu_active_ratio * 100.0);
//! println!("E-CPU frequency: {} MHz", metrics.ecpu_freq_mhz);
//! }
//! }
//! ```
//!
//! To keep an application thread responsive, create the sampler inside a
//! dedicated worker thread and send completed metrics through a channel:
//!
//! ```no_run
//! use std::{
//! sync::mpsc::{self, Receiver, TryRecvError},
//! thread,
//! };
//!
//! use macmon::{Metrics, Sampler};
//!
//! fn spawn_sampler(interval_ms: u32) -> Receiver<Metrics> {
//! let (tx, rx) = mpsc::channel();
//!
//! thread::spawn(move || {
//! let mut sampler = Sampler::new().expect("failed to create sampler");
//!
//! while let Ok(metrics) = sampler.get_metrics(interval_ms) {
//! if tx.send(metrics).is_err() {
//! break;
//! }
//! }
//! });
//!
//! rx
//! }
//!
//! fn main() {
//! let metrics = spawn_sampler(1000);
//!
//! loop {
//! match metrics.try_recv() {
//! Ok(metrics) => println!("CPU power: {:.2} W", metrics.cpu_power),
//! Err(TryRecvError::Empty) => {}
//! Err(TryRecvError::Disconnected) => break,
//! }
//!
//! // The application can continue doing other work here.
//! }
//! }
//! ```
// Re-export the commonly used types.
pub use ;
pub use SocInfo;