authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-06 00:19:32-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-15 10:48:13-07:00
log3b29d00c9826d8053b63fe2bcd86c6d1517fcc51
tree391525ad33c6f60d9205535549fe4641fd333f62
parent6377aad23a51ba6d69a01fafa60001e2238cde0f

add std.process.totalSystemMemory


2 files changed, 38 insertions(+), 0 deletions(-)

lib/std/os/windows/kernel32.zig+3
......@@ -67,6 +67,7 @@ const RUNTIME_FUNCTION = windows.RUNTIME_FUNCTION;
6767const KNONVOLATILE_CONTEXT_POINTERS = windows.KNONVOLATILE_CONTEXT_POINTERS;
6868const EXCEPTION_ROUTINE = windows.EXCEPTION_ROUTINE;
6969const MODULEENTRY32 = windows.MODULEENTRY32;
70const ULONGLONG = windows.ULONGLONG;
7071
7172pub extern "kernel32" fn AddVectoredExceptionHandler(First: c_ulong, Handler: ?VECTORED_EXCEPTION_HANDLER) callconv(WINAPI) ?*anyopaque;
7273pub extern "kernel32" fn RemoveVectoredExceptionHandler(Handle: HANDLE) callconv(WINAPI) c_ulong;
......@@ -457,3 +458,5 @@ pub extern "kernel32" fn RegOpenKeyExW(
457458 samDesired: REGSAM,
458459 phkResult: *HKEY,
459460) callconv(WINAPI) LSTATUS;
461
462pub extern "kernel32" fn GetPhysicallyInstalledSystemMemory(TotalMemoryInKilobytes: *ULONGLONG) BOOL;
lib/std/process.zig+35
......@@ -1169,3 +1169,38 @@ pub fn execve(
11691169
11701170 return os.execvpeZ_expandArg0(.no_expand, argv_buf.ptr[0].?, argv_buf.ptr, envp);
11711171}
1172
1173pub const TotalSystemMemoryError = error{
1174 UnknownTotalSystemMemory,
1175};
1176
1177/// Returns the total system memory, in bytes.
1178pub fn totalSystemMemory() TotalSystemMemoryError!usize {
1179 switch (builtin.os.tag) {
1180 .linux => {
1181 return totalSystemMemoryLinux() catch return error.UnknownTotalSystemMemory;
1182 },
1183 .windows => {
1184 var kilobytes: std.os.windows.ULONGLONG = undefined;
1185 assert(std.os.windows.kernel32.GetPhysicallyInstalledSystemMemory(&kilobytes) == std.os.windows.TRUE);
1186 return kilobytes * 1024;
1187 },
1188 else => return error.UnknownTotalSystemMemory,
1189 }
1190}
1191
1192fn totalSystemMemoryLinux() !usize {
1193 var file = try std.fs.openFileAbsoluteZ("/proc/meminfo", .{});
1194 defer file.close();
1195 var buf: [50]u8 = undefined;
1196 const amt = try file.read(&buf);
1197 if (amt != 50) return error.Unexpected;
1198 var it = std.mem.tokenize(u8, buf[0..amt], " \n");
1199 const label = it.next().?;
1200 if (!std.mem.eql(u8, label, "MemTotal:")) return error.Unexpected;
1201 const int_text = it.next() orelse return error.Unexpected;
1202 const units = it.next() orelse return error.Unexpected;
1203 if (!std.mem.eql(u8, units, "kB")) return error.Unexpected;
1204 const kilobytes = try std.fmt.parseInt(usize, int_text, 10);
1205 return kilobytes * 1024;
1206}