#include "cpu.h" #include "common/sysctl.h" static const char* detectCpuTemp(double* current) { int temp = ffSysctlGetInt("dev.cpu.0.temperature", -999999); if (temp == -999999) return "ffSysctlGetInt(\"dev.cpu.0.temperature\") failed"; // In tenth of degrees Kelvin *current = (double) temp / 10 - 273.15; return NULL; } static const char* detectThermalTemp(double* current) { int temp = ffSysctlGetInt("hw.acpi.thermal.tz0.temperature", -999999); if (temp == -999999) return "ffSysctlGetInt(\"hw.acpi.thermal.tz0.temperature\") failed"; // In tenth of degrees Kelvin *current = (double) temp / 10 - 273.15; return NULL; } const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) { if (ffSysctlGetString("hw.model", &cpu->name) != NULL) return "sysctlbyname(hw.model) failed"; cpu->coresPhysical = (uint16_t) ffSysctlGetInt("hw.ncpu", 1); cpu->coresLogical = cpu->coresPhysical; cpu->coresOnline = (uint16_t) ffSysctlGetInt("kern.smp.cpus", cpu->coresLogical); FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); if (ffSysctlGetString("kern.sched.topology_spec", &buffer) == NULL && buffer.length > 0) { // // // 0, 1, 2, 3 // // // 0, 1 // THREAD groupSMT group // // // 2, 3 // THREAD groupSMT group // // // // uint32_t i = 0; while (true) { i = ffStrbufNextIndexS(&buffer, i, "THREAD group"); // Find physical core with hyper-threading enabled if (i >= buffer.length) break; cpu->coresPhysical--; i += (uint32_t) strlen("THREAD group"); } } ffCPUDetectSpeedByCpuid(cpu); cpu->frequencyBase = (uint32_t) ffSysctlGetInt("hw.clockrate", 0); cpu->temperature = FF_CPU_TEMP_UNSET; if (options->temp) { if (detectCpuTemp(&cpu->temperature) != NULL) detectThermalTemp(&cpu->temperature); } return NULL; }