#include "log.h" #include "profiler.h" #if defined(_WIN32) || defined(_WIN64) #include #elif defined(__linux__) #include #include #elif defined(__APPLE__) && defined(__MACH__) #include #include #include #endif #include namespace profiler { uint32_t device_cpu_cores() { unsigned int core_count = 1; // default to 1 in case of failure #if defined(_WIN32) || defined(_WIN64) // Windows implementation SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); core_count = sysinfo.dwNumberOfProcessors; #elif defined(__linux__) // Linux implementation core_count = sysconf(_SC_NPROCESSORS_ONLN); #elif defined(__APPLE__) && defined(__MACH__) // macOS implementation int mib[4]; size_t len = sizeof(core_count); // set the mib for hw.ncpu mib[0] = CTL_HW; mib[1] = HW_AVAILCPU; // number of available cpus // get the number of available cpus if (sysctl(mib, 2, &core_count, &len, NULL, 0) != 0 || core_count < 1) { mib[1] = HW_NCPU; // total number of cpus if (sysctl(mib, 2, &core_count, &len, NULL, 0) != 0 || core_count < 1) { core_count = 1; // default to 1 if sysctl fails } } #endif return core_count; } uint64_t device_physical_memory(bool available) { uint64_t memory = 0; #if defined(_WIN32) || defined(_WIN64) MEMORYSTATUSEX status; status.dwLength = sizeof(status); GlobalMemoryStatusEx(&status); if (available) { memory = status.ullAvailPhys; } else { memory = status.ullTotalPhys; } #elif defined(__linux__) struct sysinfo info; if (sysinfo(&info) == 0) { memory = available ? info.freeram : info.totalram; memory *= info.mem_unit; } #elif defined(__APPLE__) && defined(__MACH__) if (available) { mach_port_t host = mach_host_self(); vm_statistics64_data_t vm_stats; mach_msg_type_number_t count = HOST_VM_INFO64_COUNT; if (host_statistics64(host, HOST_VM_INFO64, (host_info64_t)&vm_stats, &count) == KERN_SUCCESS) { memory = (vm_stats.free_count + vm_stats.inactive_count) * sysconf(_SC_PAGESIZE); } } else { int mib[2]; size_t len = sizeof(memory); mib[0] = CTL_HW; mib[1] = HW_MEMSIZE; sysctl(mib, 2, &memory, &len, NULL, 0); } #endif return memory; } } // namespace profiler