diff --git a/src/detection/cpu/cpu.c b/src/detection/cpu/cpu.c index e10cbd0f9..3a304606e 100644 --- a/src/detection/cpu/cpu.c +++ b/src/detection/cpu/cpu.c @@ -4,7 +4,7 @@ #define FF_CPU_CACHE_NAME "cpu" -void ffDetectCPUImpl(FFCPUResult* cpu, bool cached); +void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu, bool cached); static bool cacheCallback(FFCPUResult* cpu, FFCache* cache, FFCacheMethodStrbuf strbufMethod, FFCacheMethodData dataMethod) { @@ -25,7 +25,7 @@ static void detectCPU(const FFinstance* instance, FFCPUResult* cpu) bool cached = ffCacheRead(instance, cpu, FF_CPU_CACHE_NAME, (FFCacheMethodCallback) cacheCallback); - ffDetectCPUImpl(cpu, cached); + ffDetectCPUImpl(instance, cpu, cached); if(cached) return; diff --git a/src/detection/cpu/cpu_apple.c b/src/detection/cpu/cpu_apple.c index aa0a07c96..90e948a6a 100644 --- a/src/detection/cpu/cpu_apple.c +++ b/src/detection/cpu/cpu_apple.c @@ -12,10 +12,13 @@ static double getFrequency(const char* propName) return herz / 1000.0; //to GHz } -void ffDetectCPUImpl(FFCPUResult* cpu, bool cached) +void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu, bool cached) { + FF_UNUSED(instance); + //TODO find a way to detect this cpu->temperature = FF_CPU_TEMP_UNSET; + if(cached) return; diff --git a/src/detection/cpu/cpu_bsd.c b/src/detection/cpu/cpu_bsd.c index 5135efdb0..46f60b4e6 100644 --- a/src/detection/cpu/cpu_bsd.c +++ b/src/detection/cpu/cpu_bsd.c @@ -1,9 +1,12 @@ #include "cpu.h" #include "common/sysctl.h" -void ffDetectCPUImpl(FFCPUResult* cpu, bool cached) +void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu, bool cached) { + FF_UNUSED(instance); + cpu->temperature = FF_CPU_TEMP_UNSET; + if(cached) return; diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index eeddb5609..51da397db 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -60,9 +60,9 @@ static double getFrequency(const char* info, const char* scaling) return getGHz(scaling); } -static double detectCPUTemp() +static double detectCPUTemp(const FFinstance* instance) { - const FFTempsResult* temps = ffDetectTemps(); + const FFTempsResult* temps = ffDetectTemps(instance); for(uint32_t i = 0; i < temps->values.length; i++) { @@ -78,9 +78,10 @@ static double detectCPUTemp() return FF_CPU_TEMP_UNSET; } -void ffDetectCPUImpl(FFCPUResult* cpu, bool cached) +void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu, bool cached) { - cpu->temperature = detectCPUTemp(); + cpu->temperature = detectCPUTemp(instance); + if(cached) return; diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index a9d773d90..3cceae9b3 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -150,9 +150,9 @@ static void pciDetectDriverName(FFGPUResult* gpu, PCIData* pci, struct pci_dev* ffStrbufDestroy(&path); } -static void pciDetectTemperatur(FFGPUResult* gpu, struct pci_dev* device) +static void pciDetectTemperatur(const FFinstance* instance, FFGPUResult* gpu, struct pci_dev* device) { - const FFTempsResult* tempsResult = ffDetectTemps(); + const FFTempsResult* tempsResult = ffDetectTemps(instance); for(uint32_t i = 0; i < tempsResult->values.length; i++) { @@ -171,7 +171,7 @@ static void pciDetectTemperatur(FFGPUResult* gpu, struct pci_dev* device) } } -static void pciHandleDevice(FFlist* results, PCIData* pci, struct pci_dev* device) +static void pciHandleDevice(const FFinstance* instance, FFlist* results, PCIData* pci, struct pci_dev* device) { pci->ffpci_fill_info(device, PCI_FILL_CLASS); @@ -200,7 +200,7 @@ static void pciHandleDevice(FFlist* results, PCIData* pci, struct pci_dev* devic gpu->coreCount = FF_GPU_CORE_COUNT_UNSET; gpu->temperature = FF_GPU_TEMP_UNSET; - pciDetectTemperatur(gpu, device); + pciDetectTemperatur(instance, gpu, device); } static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus) @@ -229,7 +229,7 @@ static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus) struct pci_dev* device = pci.access->devices; while(device != NULL) { - pciHandleDevice(gpus, &pci, device); + pciHandleDevice(instance, gpus, &pci, device); device = device->next; } diff --git a/src/detection/temps.c b/src/detection/temps.c index a566a9c41..391a05954 100644 --- a/src/detection/temps.c +++ b/src/detection/temps.c @@ -6,48 +6,20 @@ #include #include -static bool isTempFile(const char* name) -{ - return - strncmp(name, "temp", 4) == 0 && - name[4] >= '0' && - name[4] <= '9' && - strncmp(name + 5, "_input", 6) == 0; -} - static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value) { - DIR* dirp = opendir(dir->chars); - if(dirp == NULL) - return false; - uint32_t dirLength = dir->length; - value->value = 0.0 / 0.0; //use NaN as error value - FFstrbuf valueString; - ffStrbufInit(&valueString); + FFstrbuf valueBuffer; + ffStrbufInit(&valueBuffer); - struct dirent* dirent; - while((dirent = readdir(dirp)) != NULL) - { - if(!isTempFile(dirent->d_name)) - continue; + ffStrbufAppendS(dir, "temp1_input"); + ffReadFileBuffer(dir->chars, &valueBuffer); + ffStrbufSubstrBefore(dir, dirLength); - ffStrbufAppendS(dir, dirent->d_name); - ffReadFileBuffer(dir->chars, &valueString); - ffStrbufSubstrBefore(dir, dirLength); + value->value = ffStrbufToDouble(&valueBuffer); - //ffStrbufToDouble() returns NaN if the string couldn't be parsed - value->value = ffStrbufToDouble(&valueString); - if(value->value != value->value) - continue; - - value->value /= 1000.0; //millidegrees to degrees - break; - } - - closedir(dirp); - ffStrbufDestroy(&valueString); + ffStrbufDestroy(&valueBuffer); if(value->value != value->value) return false; @@ -63,7 +35,7 @@ static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value) return value->name.length > 0 || value->deviceClass.length > 0; } -const FFTempsResult* ffDetectTemps() +const FFTempsResult* ffDetectTemps(const FFinstance* instance) { static FFTempsResult result; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; @@ -77,6 +49,13 @@ const FFTempsResult* ffDetectTemps() } init = true; + if(!instance->config.allowSlowOperations) + { + ffListInitA(&result.values, sizeof(FFTempValue), 0); + pthread_mutex_unlock(&mutex); + return &result; + } + ffListInitA(&result.values, sizeof(FFTempValue), 16); FFstrbuf baseDir; diff --git a/src/detection/temps.h b/src/detection/temps.h index 5866843c2..3f923b0ff 100644 --- a/src/detection/temps.h +++ b/src/detection/temps.h @@ -17,6 +17,6 @@ typedef struct FFTempsResult FFlist values; //List of FFTempValue } FFTempsResult; -const FFTempsResult* ffDetectTemps(); +const FFTempsResult* ffDetectTemps(const FFinstance* instance); #endif