| 74 | /* ── Pressure logging (hysteresis) ────────────────────────────── */ |
| 75 | |
| 76 | static void check_pressure(size_t rss) { |
| 77 | if (g_budget == 0) { |
| 78 | return; |
| 79 | } |
| 80 | |
| 81 | bool over = rss > g_budget; |
| 82 | int was = atomic_load(&g_was_over); |
| 83 | |
| 84 | if (over && !was) { |
| 85 | atomic_store(&g_was_over, 1); |
| 86 | char rss_mb[CBM_SZ_32]; |
| 87 | char budget_mb[CBM_SZ_32]; |
| 88 | char pct_str[CBM_SZ_16]; |
| 89 | snprintf(rss_mb, sizeof(rss_mb), "%zu", rss / MB_DIVISOR); |
| 90 | snprintf(budget_mb, sizeof(budget_mb), "%zu", g_budget / MB_DIVISOR); |
| 91 | snprintf(pct_str, sizeof(pct_str), "%zu", |
| 92 | g_budget > 0 ? (rss * CBM_PERCENT) / g_budget : 0); |
| 93 | cbm_log_warn("mem.pressure.warn", "rss_mb", rss_mb, "budget_mb", budget_mb, "pct", pct_str); |
| 94 | } else if (!over && was) { |
| 95 | atomic_store(&g_was_over, 0); |
| 96 | char rss_mb[CBM_SZ_32]; |
| 97 | char budget_mb[CBM_SZ_32]; |
| 98 | char pct_str[CBM_SZ_16]; |
| 99 | snprintf(rss_mb, sizeof(rss_mb), "%zu", rss / MB_DIVISOR); |
| 100 | snprintf(budget_mb, sizeof(budget_mb), "%zu", g_budget / MB_DIVISOR); |
| 101 | snprintf(pct_str, sizeof(pct_str), "%zu", |
| 102 | g_budget > 0 ? (rss * CBM_PERCENT) / g_budget : 0); |
| 103 | cbm_log_info("mem.pressure.ok", "rss_mb", rss_mb, "budget_mb", budget_mb, "pct", pct_str); |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | /* ── Public API ────────────────────────────────────────────────── */ |
| 108 |
no outgoing calls
no test coverage detected