summaryrefslogtreecommitdiff
path: root/source/util/Diag.mc
blob: aea2a7056d0a261fb738691a9f29dd885034b0af (plain) (blame)
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
// Author:  cirakg & claude ai
// Summary: Debug-only diagnostics (start-up time, memory) for `make perf` and `make memtest`.
//
// Debug builds print one machine-readable line per event to the simulator
// console: "DIAG", the event name, then key=value pairs, for example
//     DIAG first_frame startup_ms=1 mem_used=6984 mem_total=781888
// tools/check_budgets.py reads these lines and compares them with
// tools/budgets.json. Plain key=value pairs are used instead of JSON because
// the simulator console escapes quotes. Release builds compile the empty
// (:release) versions instead, so a real watch running a release build never
// logs anything.
//
// Security rule: only timings and memory counters ever go through here, never
// secrets, codes or entry names. This is the only file allowed to call
// System.println outside tests (enforced by tools/lint_project.py).

import Toybox.Lang;
import Toybox.System;

module Diag {

    // System.getTimer() value when the app object was created.
    (:debug)
    var startMs as Number = 0;

    // Start the start-up timer. Called from OtpWalletApp.initialize().
    (:debug)
    function markStart() as Void {
        startMs = System.getTimer();
    }

    (:release)
    function markStart() as Void {
    }

    // Report start-up time and memory use after the first complete frame.
    // startup_ms covers app object creation to the end of the first draw. The
    // time the system needs to load the program before that is invisible to
    // the app; app-diag.sh measures it from outside (README section 18).
    (:debug)
    function firstFrame() as Void {
        var stats = System.getSystemStats();
        System.println("DIAG first_frame startup_ms=" + (System.getTimer() - startMs)
            + " mem_used=" + stats.usedMemory + " mem_total=" + stats.totalMemory);
    }

    (:release)
    function firstFrame() as Void {
    }
}