From a7b3c2141335a595c3452e1c5591330af3274186 Mon Sep 17 00:00:00 2001 From: Thefrank <1910378+Thefrank@users.noreply.github.com> Date: Wed, 30 Aug 2023 15:49:06 -0600 Subject: [PATCH 1/2] FreeBSD segments --- src/coreclr/gc/unix/gcenv.unix.cpp | 46 ++++++++++------ src/coreclr/pal/src/misc/sysinfo.cpp | 53 ++++++++++++------- .../System.Runtime/tests/System/GCTests.cs | 1 - 3 files changed, 63 insertions(+), 37 deletions(-) diff --git a/src/coreclr/gc/unix/gcenv.unix.cpp b/src/coreclr/gc/unix/gcenv.unix.cpp index 285b783485802..ab99940a0151c 100644 --- a/src/coreclr/gc/unix/gcenv.unix.cpp +++ b/src/coreclr/gc/unix/gcenv.unix.cpp @@ -1160,7 +1160,34 @@ uint64_t GetAvailablePhysicalMemory() uint64_t available = 0; // Get the physical memory available. -#ifndef __APPLE__ +#if defined(__APPLE__) + vm_size_t page_size; + mach_port_t mach_port; + mach_msg_type_number_t count; + vm_statistics_data_t vm_stats; + mach_port = mach_host_self(); + count = sizeof(vm_stats) / sizeof(natural_t); + if (KERN_SUCCESS == host_page_size(mach_port, &page_size)) + { + if (KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO, (host_info_t)&vm_stats, &count)) + { + available = (int64_t)vm_stats.free_count * (int64_t)page_size; + } + } + mach_port_deallocate(mach_task_self(), mach_port); +#elif defined(__FreeBSD__) + size_t inactive_count = 0, laundry_count = 0, free_count = 0; + size_t sz = sizeof(inactive_count); + sysctlbyname("vm.stats.vm.v_inactive_count", &inactive_count, &sz, NULL, 0); + + sz = sizeof(laundry_count); + sysctlbyname("vm.stats.vm.v_laundry_count", &laundry_count, &sz, NULL, 0); + + sz = sizeof(free_count); + sysctlbyname("vm.stats.vm.v_free_count", &free_count, &sz, NULL, 0); + + available = (inactive_count + laundry_count + free_count) * sysconf(_SC_PAGESIZE); +#else // Linux static volatile bool tryReadMemInfo = true; if (tryReadMemInfo) @@ -1176,22 +1203,7 @@ uint64_t GetAvailablePhysicalMemory() // Fall back to getting the available pages using sysconf. available = sysconf(SYSCONF_PAGES) * sysconf(_SC_PAGE_SIZE); } -#else // __APPLE__ - vm_size_t page_size; - mach_port_t mach_port; - mach_msg_type_number_t count; - vm_statistics_data_t vm_stats; - mach_port = mach_host_self(); - count = sizeof(vm_stats) / sizeof(natural_t); - if (KERN_SUCCESS == host_page_size(mach_port, &page_size)) - { - if (KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO, (host_info_t)&vm_stats, &count)) - { - available = (int64_t)vm_stats.free_count * (int64_t)page_size; - } - } - mach_port_deallocate(mach_task_self(), mach_port); -#endif // __APPLE__ +#endif return available; } diff --git a/src/coreclr/pal/src/misc/sysinfo.cpp b/src/coreclr/pal/src/misc/sysinfo.cpp index cd7f0304b955a..4b520b31ad995 100644 --- a/src/coreclr/pal/src/misc/sysinfo.cpp +++ b/src/coreclr/pal/src/misc/sysinfo.cpp @@ -431,7 +431,39 @@ GlobalMemoryStatusEx( // We do this only when we have the total physical memory available. if (lpBuffer->ullTotalPhys > 0) { -#ifndef __APPLE__ +#if defined (__APPLE__) + vm_size_t page_size; + mach_port_t mach_port; + mach_msg_type_number_t count; + vm_statistics_data_t vm_stats; + mach_port = mach_host_self(); + count = sizeof(vm_stats) / sizeof(natural_t); + if (KERN_SUCCESS == host_page_size(mach_port, &page_size)) + { + if (KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO, (host_info_t)&vm_stats, &count)) + { + lpBuffer->ullAvailPhys = (int64_t)vm_stats.free_count * (int64_t)page_size; + INT64 used_memory = ((INT64)vm_stats.active_count + (INT64)vm_stats.inactive_count + (INT64)vm_stats.wire_count) * (INT64)page_size; + lpBuffer->dwMemoryLoad = (DWORD)((used_memory * 100) / lpBuffer->ullTotalPhys); + } + } + mach_port_deallocate(mach_task_self(), mach_port); +#elif defined (__FreeBSD__) + size_t inactive_count = 0, laundry_count = 0, free_count = 0; + size_t sz = sizeof(inactive_count); + sysctlbyname("vm.stats.vm.v_inactive_count", &inactive_count, &sz, NULL, 0); + + sz = sizeof(laundry_count); + sysctlbyname("vm.stats.vm.v_laundry_count", &laundry_count, &sz, NULL, 0); + + sz = sizeof(free_count); + sysctlbyname("vm.stats.vm.v_free_count", &free_count, &sz, NULL, 0); + + lpBuffer->ullAvailPhys = (inactive_count + laundry_count + free_count) * sysconf(_SC_PAGE_SIZE); + + INT64 used_memory = lpBuffer->ullTotalPhys - lpBuffer->ullAvailPhys; + lpBuffer->dwMemoryLoad = (DWORD)((used_memory * 100) / lpBuffer->ullTotalPhys); +#else //Linux static volatile bool tryReadMemInfo = true; if (tryReadMemInfo) @@ -450,24 +482,7 @@ GlobalMemoryStatusEx( INT64 used_memory = lpBuffer->ullTotalPhys - lpBuffer->ullAvailPhys; lpBuffer->dwMemoryLoad = (DWORD)((used_memory * 100) / lpBuffer->ullTotalPhys); -#else - vm_size_t page_size; - mach_port_t mach_port; - mach_msg_type_number_t count; - vm_statistics_data_t vm_stats; - mach_port = mach_host_self(); - count = sizeof(vm_stats) / sizeof(natural_t); - if (KERN_SUCCESS == host_page_size(mach_port, &page_size)) - { - if (KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO, (host_info_t)&vm_stats, &count)) - { - lpBuffer->ullAvailPhys = (int64_t)vm_stats.free_count * (int64_t)page_size; - INT64 used_memory = ((INT64)vm_stats.active_count + (INT64)vm_stats.inactive_count + (INT64)vm_stats.wire_count) * (INT64)page_size; - lpBuffer->dwMemoryLoad = (DWORD)((used_memory * 100) / lpBuffer->ullTotalPhys); - } - } - mach_port_deallocate(mach_task_self(), mach_port); -#endif // __APPLE__ +#endif } #ifndef TARGET_RISCV64 diff --git a/src/libraries/System.Runtime/tests/System/GCTests.cs b/src/libraries/System.Runtime/tests/System/GCTests.cs index d161b3bbdde5b..73a379402a233 100644 --- a/src/libraries/System.Runtime/tests/System/GCTests.cs +++ b/src/libraries/System.Runtime/tests/System/GCTests.cs @@ -818,7 +818,6 @@ public static void GetAllocatedBytesForCurrentThread(int size) private static bool IsNotArmProcessAndRemoteExecutorSupported => PlatformDetection.IsNotArmProcess && RemoteExecutor.IsSupported; - [ActiveIssue("https://github.com/dotnet/runtime/issues/64935", TestPlatforms.FreeBSD)] [ActiveIssue("https://github.com/dotnet/runtime/issues/73167", TestRuntimes.Mono)] [ConditionalFact(nameof(IsNotArmProcessAndRemoteExecutorSupported))] // [ActiveIssue("https://github.com/dotnet/runtime/issues/29434")] public static void GetGCMemoryInfo() From 62854ae502a5389b1ba4b8bb74ca06b7b48e62a7 Mon Sep 17 00:00:00 2001 From: Thefrank <1910378+Thefrank@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:20:11 -0600 Subject: [PATCH 2/2] From review: Revert changes to unused code --- src/coreclr/pal/src/misc/sysinfo.cpp | 53 ++++++++++------------------ 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/src/coreclr/pal/src/misc/sysinfo.cpp b/src/coreclr/pal/src/misc/sysinfo.cpp index 4b520b31ad995..cd7f0304b955a 100644 --- a/src/coreclr/pal/src/misc/sysinfo.cpp +++ b/src/coreclr/pal/src/misc/sysinfo.cpp @@ -431,39 +431,7 @@ GlobalMemoryStatusEx( // We do this only when we have the total physical memory available. if (lpBuffer->ullTotalPhys > 0) { -#if defined (__APPLE__) - vm_size_t page_size; - mach_port_t mach_port; - mach_msg_type_number_t count; - vm_statistics_data_t vm_stats; - mach_port = mach_host_self(); - count = sizeof(vm_stats) / sizeof(natural_t); - if (KERN_SUCCESS == host_page_size(mach_port, &page_size)) - { - if (KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO, (host_info_t)&vm_stats, &count)) - { - lpBuffer->ullAvailPhys = (int64_t)vm_stats.free_count * (int64_t)page_size; - INT64 used_memory = ((INT64)vm_stats.active_count + (INT64)vm_stats.inactive_count + (INT64)vm_stats.wire_count) * (INT64)page_size; - lpBuffer->dwMemoryLoad = (DWORD)((used_memory * 100) / lpBuffer->ullTotalPhys); - } - } - mach_port_deallocate(mach_task_self(), mach_port); -#elif defined (__FreeBSD__) - size_t inactive_count = 0, laundry_count = 0, free_count = 0; - size_t sz = sizeof(inactive_count); - sysctlbyname("vm.stats.vm.v_inactive_count", &inactive_count, &sz, NULL, 0); - - sz = sizeof(laundry_count); - sysctlbyname("vm.stats.vm.v_laundry_count", &laundry_count, &sz, NULL, 0); - - sz = sizeof(free_count); - sysctlbyname("vm.stats.vm.v_free_count", &free_count, &sz, NULL, 0); - - lpBuffer->ullAvailPhys = (inactive_count + laundry_count + free_count) * sysconf(_SC_PAGE_SIZE); - - INT64 used_memory = lpBuffer->ullTotalPhys - lpBuffer->ullAvailPhys; - lpBuffer->dwMemoryLoad = (DWORD)((used_memory * 100) / lpBuffer->ullTotalPhys); -#else //Linux +#ifndef __APPLE__ static volatile bool tryReadMemInfo = true; if (tryReadMemInfo) @@ -482,7 +450,24 @@ GlobalMemoryStatusEx( INT64 used_memory = lpBuffer->ullTotalPhys - lpBuffer->ullAvailPhys; lpBuffer->dwMemoryLoad = (DWORD)((used_memory * 100) / lpBuffer->ullTotalPhys); -#endif +#else + vm_size_t page_size; + mach_port_t mach_port; + mach_msg_type_number_t count; + vm_statistics_data_t vm_stats; + mach_port = mach_host_self(); + count = sizeof(vm_stats) / sizeof(natural_t); + if (KERN_SUCCESS == host_page_size(mach_port, &page_size)) + { + if (KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO, (host_info_t)&vm_stats, &count)) + { + lpBuffer->ullAvailPhys = (int64_t)vm_stats.free_count * (int64_t)page_size; + INT64 used_memory = ((INT64)vm_stats.active_count + (INT64)vm_stats.inactive_count + (INT64)vm_stats.wire_count) * (INT64)page_size; + lpBuffer->dwMemoryLoad = (DWORD)((used_memory * 100) / lpBuffer->ullTotalPhys); + } + } + mach_port_deallocate(mach_task_self(), mach_port); +#endif // __APPLE__ } #ifndef TARGET_RISCV64