redbear-power: v1.26 remove dead code (BREAKING)

Completes the v1.22 audit W2 cleanup. v1.23 deferred this for a
CHANGELOG note; this release documents the breaking change.

REMOVED (no callers anywhere in the source tree):

- ProcInfo::read_with_cpu_pct(prev, dt_secs, num_cpus)
  Was a 1-line wrapper around read_with_cpu_pct_sorted(..., Rss)
  that no caller actually used. Migration: call
  read_with_cpu_pct_sorted(prev, dt, ncpu, SortMode::default())
  inline (or just use ProcInfo::read() if RSS is fine).

- ProcInfo::available() -> bool
  Was a pre-flight check ('is /proc mounted?') that no caller
  used. read() already returns ProcInfo::default() when /proc
  is absent, so the empty result is the same signal. Migration:
  check !proc.is_empty() after a read, or call read() and
  handle the empty case.

OTHER CHANGES:

- Removed unused 'use std::path::Path;' (was only used by the
  removed ProcInfo::available).
- Updated read_with_cpu_pct_sorted doc comment to mention
  'CPU% and IO rates' (reflects the v1.25 addition).

BREAKING: any external consumer of redbear-power's process module
that called either of these methods will fail to compile. The
recipe's own source (the only known consumer) is updated.

Test count: 101 (unchanged; removed methods were untested).
Compile warnings: 55 -> 54 (the unused Path import is gone).

Redox stripped binary: 4,168,552 bytes (unchanged; the removed
code was tiny and the linker dedup'd the wrapper body).

Docs: local/docs/redbear-power-improvement-plan.md \xC2\xA750
This commit is contained in:
2026-06-21 01:05:09 +03:00
parent aaa1b950b4
commit 04894a18c9
2 changed files with 104 additions and 12 deletions
+100 -2
View File
@@ -4573,15 +4573,113 @@ as an unanswerable question.
- **Per-thread IO** (htop scans `task/[pid]/io`) — not a common
operator question on a power TUI, and adds N×file-open cost.
- **RCHAR/WCHAR/SYSCR/SYSCW** (htop's "IO details" columns) —
beyond the power/thermal scope. Defer to a future v1.26 if user
beyond the power/thermal scope. Defer to a future v1.27 if user
demand appears.
- **Persistent rate sparkline** (rolling average of last N samples) —
a per-process IO rate over time is a natural visualization but
requires storing a Vec<Sample> per process across refreshes. Defer
to a future v1.27 with proper memory accounting.
to a future v1.28 with proper memory accounting.
---
## 50. v1.26 Dead Code Removal (BREAKING) (2026-06-21)
Per the v1.22 internal audit (W2: "`ProcInfo::available` and
`ProcInfo::read_with_cpu_pct` (without `_sorted`) are dead code"),
v1.26 removes both methods. v1.23 deferred this for a CHANGELOG
note; this release documents the breaking change.
### 50.1 CHANGELOG
**BREAKING — public API removed in v1.26**:
```rust
// REMOVED — use read_with_cpu_pct_sorted(prev, dt, ncpu, SortMode::default())
// or just read() (which uses the default sort).
ProcInfo::read_with_cpu_pct(prev, dt_secs, num_cpus) -> Self
// REMOVED — use fs::metadata("/proc").map(|m| m.is_dir()).unwrap_or(false)
// or check the result of ProcInfo::read() (empty == not available).
ProcInfo::available() -> bool
```
**Migration path**:
- `read_with_cpu_pct(prev, dt, ncpu)` → `read_with_cpu_pct_sorted(prev, dt, ncpu, SortMode::default())`
(one-liner; the wrapper was a 1-line convenience that any caller
can replace inline)
- `ProcInfo::available()` → `!ProcInfo::read().is_empty()` (or just
attempt the read and handle the empty result)
**Why safe to remove**:
- Verified zero callers in `local/recipes/system/redbear-power/source/`
via `grep -rn`. The two methods were never wired into the TUI
dispatch (only `_sorted` variants are).
- `available()` was originally intended as a pre-flight check
("is `/proc` mounted?") but `read()` already returns
`ProcInfo::default()` when `/proc` is absent — the empty
result is the same signal.
- `read_with_cpu_pct` (no `_sorted`) was a convenience wrapper
around `read_with_cpu_pct_sorted(..., SortMode::default())` that
no caller actually used; the only call site in
`local/docs/redbear-power-improvement-plan.md` is a historical
reference in a code-quote describing the v1.14 implementation.
### 50.2 Other changes
**Removed**:
- `use std::path::Path;` (no longer used after `available()` removal)
**Updated**:
- `read_with_cpu_pct_sorted` doc comment now mentions "CPU% **and
IO rates**" (the v1.25 addition to the function body).
### 50.3 Test coverage
Test count: **101** (unchanged). No test changes — the removed
methods were untested dead code. Removing dead untested code is a
zero-risk change for the test surface.
### 50.4 Compile warning delta
| Before v1.26 | After v1.26 | Delta |
|--------------|-------------|-------|
| 55 | 54 | -1 |
The single warning removed: `unused import: Path` in `process.rs:19`.
The other 54 warnings are pre-existing in unrelated modules
(smart.rs, sensor.rs, storage.rs, etc.) and out of scope for v1.26.
### 50.5 Cross-compile + smoke test
| Target | Size | SHA256 |
|--------------|-------------|-------------------------------------------------------------------|
| Linux host | 3.0 MB | (run from `target/release/redbear-power`) |
| Redox x86_64 | 4,168,552 B | `82bcf92a681fe0251966094c8eee2e8810fc8edff675dbc94e7d0945eb66f99c` |
Binary size delta: 0 bytes (the removed code was tiny and the
linker dedup'd it from the existing `read_with_cpu_pct_sorted`
body via the inlined `Self::read_with_cpu_pct_sorted(...)` call
that was in `read_with_cpu_pct`).
Smoke test confirms `--once` mode still works:
```
sort: RSS (press 'o' to cycle, '/' to filter)
PID STATE PRIO NI THR CPU% IO RATE RSS COMM
```
### 50.6 Project policy alignment
This release aligns with the project's
"DO NOT** suppress warnings... investigate, diagnose, and fix
the root cause" policy (AGENTS.md). v1.23 suppressed
`ppid`/`vsize_kb` dead-code warnings with `#[allow(dead_code)]`
and a documented future use; v1.26 completes the cleanup by
removing the two methods that had no future use case at all.
---
## See Also
## See Also
- **`local/docs/RATATUI-APP-PATTERNS.md`** §13 — the canonical ratatui 0.30 best-practices update that this plan is derived from. Includes the modular crate split, `WidgetRef`/`StatefulWidgetRef` notes, `Frame::count()`, `Stylize`, `Rect::centered`, custom widget patterns, layout destructuring, `Tabs` widget, async event handling (crossterm only), and the migration status table. Use this as the implementation guide while this doc is the roadmap.
@@ -16,7 +16,6 @@
//! `(no processes detected)`.
use std::fs;
use std::path::Path;
const MAX_PROCESSES: usize = 50;
@@ -317,9 +316,6 @@ fn read_process(pid: u32) -> Option<ProcessInfo> {
}
impl ProcInfo {
pub fn available() -> bool {
Path::new("/proc").is_dir()
}
pub fn read() -> Self {
Self::read_sorted(SortMode::default())
}
@@ -349,13 +345,11 @@ impl ProcInfo {
Self { processes, total_memory_kb, total_count }
}
/// Read processes and compute CPU% for each based on delta of total
/// CPU ticks vs the previous read. `dt_secs` is wall-clock elapsed
/// Read processes and compute CPU% and IO rates for each based on
/// the delta vs the previous read. `dt_secs` is wall-clock elapsed
/// since previous read; `num_cpus` is used to normalize per-CPU.
pub fn read_with_cpu_pct(prev: &ProcInfo, dt_secs: f64, num_cpus: u64) -> Self {
Self::read_with_cpu_pct_sorted(prev, dt_secs, num_cpus, SortMode::default())
}
/// IO rate is computed in KiB/s from the delta of `/proc/[pid]/io`
/// read_bytes/write_bytes divided by `dt_secs`.
pub fn read_with_cpu_pct_sorted(prev: &ProcInfo, dt_secs: f64, num_cpus: u64, sort_mode: SortMode) -> Self {
let mut info = Self::read_sorted(sort_mode);
if dt_secs <= 0.0 || num_cpus == 0 {