| 107 | /* ── Public API ────────────────────────────────────────────────── */ |
| 108 | |
| 109 | void cbm_vmem_init(double ram_fraction) { |
| 110 | /* Only first call takes effect */ |
| 111 | int expected = 0; |
| 112 | if (!atomic_compare_exchange_strong(&g_initialized, &expected, 1)) { |
| 113 | return; |
| 114 | } |
| 115 | |
| 116 | if (ram_fraction <= 0.0 || ram_fraction > 1.0) { |
| 117 | ram_fraction = 0.5; |
| 118 | } |
| 119 | |
| 120 | cbm_system_info_t info = cbm_system_info(); |
| 121 | g_budget = (size_t)((double)info.total_ram * ram_fraction); |
| 122 | |
| 123 | char budget_mb[CBM_SZ_32]; |
| 124 | char ram_mb[CBM_SZ_32]; |
| 125 | snprintf(budget_mb, sizeof(budget_mb), "%zu", g_budget / MB_DIVISOR); |
| 126 | snprintf(ram_mb, sizeof(ram_mb), "%zu", info.total_ram / MB_DIVISOR); |
| 127 | cbm_log_info("vmem.init", "budget_mb", budget_mb, "total_ram_mb", ram_mb); |
| 128 | } |
| 129 | |
| 130 | void *cbm_vmem_alloc(size_t size) { |
| 131 | if (size == 0) { |
no test coverage detected