mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 14:23:09 +00:00
windows: replace GetPhysicallyInstalledSystemMemory with ntdll.
`GetPhysicallyInstalledSystemMemory` uses SMBios to grab the physical memory size which can lead to unecessary allocation and inacurate representation of the total memory. Using `System_Basic_Information` help to retrieve the physical memory which is not reserved for the kernel/tables. This aligns better with the linux side as `/proc/meminfo` does the same thing.
This commit is contained in:
parent
7b908e173f
commit
0733c8c5ca
@ -4476,6 +4476,34 @@ pub const MODULEENTRY32 = extern struct {
|
|||||||
szExePath: [MAX_PATH]CHAR,
|
szExePath: [MAX_PATH]CHAR,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const SYSTEM_INFORMATION_CLASS = enum(c_int) {
|
||||||
|
SystemBasicInformation = 0,
|
||||||
|
SystemPerformanceInformation = 2,
|
||||||
|
SystemTimeOfDayInformation = 3,
|
||||||
|
SystemProcessInformation = 5,
|
||||||
|
SystemProcessorPerformanceInformation = 8,
|
||||||
|
SystemInterruptInformation = 23,
|
||||||
|
SystemExceptionInformation = 33,
|
||||||
|
SystemRegistryQuotaInformation = 37,
|
||||||
|
SystemLookasideInformation = 45,
|
||||||
|
SystemCodeIntegrityInformation = 103,
|
||||||
|
SystemPolicyInformation = 134,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const SYSTEM_BASIC_INFORMATION = extern struct {
|
||||||
|
Reserved: ULONG,
|
||||||
|
TimerResolution: ULONG,
|
||||||
|
PageSize: ULONG,
|
||||||
|
NumberOfPhysicalPages: ULONG,
|
||||||
|
LowestPhysicalPageNumber: ULONG,
|
||||||
|
HighestPhysicalPageNumber: ULONG,
|
||||||
|
AllocationGranularity: ULONG,
|
||||||
|
MinimumUserModeAddress: ULONG_PTR,
|
||||||
|
MaximumUserModeAddress: ULONG_PTR,
|
||||||
|
ActiveProcessorsAffinityMask: KAFFINITY,
|
||||||
|
NumberOfProcessors: UCHAR,
|
||||||
|
};
|
||||||
|
|
||||||
pub const THREADINFOCLASS = enum(c_int) {
|
pub const THREADINFOCLASS = enum(c_int) {
|
||||||
ThreadBasicInformation,
|
ThreadBasicInformation,
|
||||||
ThreadTimes,
|
ThreadTimes,
|
||||||
|
|||||||
@ -31,6 +31,7 @@ const UNWIND_HISTORY_TABLE = windows.UNWIND_HISTORY_TABLE;
|
|||||||
const RUNTIME_FUNCTION = windows.RUNTIME_FUNCTION;
|
const RUNTIME_FUNCTION = windows.RUNTIME_FUNCTION;
|
||||||
const KNONVOLATILE_CONTEXT_POINTERS = windows.KNONVOLATILE_CONTEXT_POINTERS;
|
const KNONVOLATILE_CONTEXT_POINTERS = windows.KNONVOLATILE_CONTEXT_POINTERS;
|
||||||
const EXCEPTION_ROUTINE = windows.EXCEPTION_ROUTINE;
|
const EXCEPTION_ROUTINE = windows.EXCEPTION_ROUTINE;
|
||||||
|
const SYSTEM_INFORMATION_CLASS = windows.SYSTEM_INFORMATION_CLASS;
|
||||||
const THREADINFOCLASS = windows.THREADINFOCLASS;
|
const THREADINFOCLASS = windows.THREADINFOCLASS;
|
||||||
const PROCESSINFOCLASS = windows.PROCESSINFOCLASS;
|
const PROCESSINFOCLASS = windows.PROCESSINFOCLASS;
|
||||||
const LPVOID = windows.LPVOID;
|
const LPVOID = windows.LPVOID;
|
||||||
@ -51,6 +52,14 @@ pub extern "ntdll" fn NtQueryInformationThread(
|
|||||||
ThreadInformationLength: ULONG,
|
ThreadInformationLength: ULONG,
|
||||||
ReturnLength: ?*ULONG,
|
ReturnLength: ?*ULONG,
|
||||||
) callconv(WINAPI) NTSTATUS;
|
) callconv(WINAPI) NTSTATUS;
|
||||||
|
|
||||||
|
pub extern "ntdll" fn NtQuerySystemInformation(
|
||||||
|
SystemInformationClass: SYSTEM_INFORMATION_CLASS,
|
||||||
|
SystemInformation: PVOID,
|
||||||
|
SystemInformationLength: ULONG,
|
||||||
|
ReturnLength: ?*ULONG,
|
||||||
|
) callconv(WINAPI) NTSTATUS;
|
||||||
|
|
||||||
pub extern "ntdll" fn NtSetInformationThread(
|
pub extern "ntdll" fn NtSetInformationThread(
|
||||||
ThreadHandle: HANDLE,
|
ThreadHandle: HANDLE,
|
||||||
ThreadInformationClass: THREADINFOCLASS,
|
ThreadInformationClass: THREADINFOCLASS,
|
||||||
|
|||||||
@ -1163,10 +1163,17 @@ pub fn totalSystemMemory() TotalSystemMemoryError!usize {
|
|||||||
return totalSystemMemoryLinux() catch return error.UnknownTotalSystemMemory;
|
return totalSystemMemoryLinux() catch return error.UnknownTotalSystemMemory;
|
||||||
},
|
},
|
||||||
.windows => {
|
.windows => {
|
||||||
var kilobytes: std.os.windows.ULONGLONG = undefined;
|
var sbi: std.os.windows.SYSTEM_BASIC_INFORMATION = undefined;
|
||||||
if (std.os.windows.kernel32.GetPhysicallyInstalledSystemMemory(&kilobytes) != std.os.windows.TRUE)
|
const rc = std.os.windows.ntdll.NtQuerySystemInformation(
|
||||||
|
.SystemBasicInformation,
|
||||||
|
&sbi,
|
||||||
|
@sizeOf(std.os.windows.SYSTEM_BASIC_INFORMATION),
|
||||||
|
null,
|
||||||
|
);
|
||||||
|
if (rc != .SUCCESS) {
|
||||||
return error.UnknownTotalSystemMemory;
|
return error.UnknownTotalSystemMemory;
|
||||||
return kilobytes * 1024;
|
}
|
||||||
|
return @as(usize, sbi.NumberOfPhysicalPages) * sbi.PageSize;
|
||||||
},
|
},
|
||||||
else => return error.UnknownTotalSystemMemory,
|
else => return error.UnknownTotalSystemMemory,
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user