diff options
author | Benny Baumann <BenBE@geshi.org> | 2020-12-12 20:43:08 +0100 |
---|---|---|
committer | Benny Baumann <BenBE@geshi.org> | 2020-12-13 11:47:34 +0100 |
commit | f32f0188cd140f965c5e02f7fb875116522c4b41 (patch) | |
tree | 5eeffc53cf9c7ad26f441e31df7df6a15e81fa9f /darwin | |
parent | e65cdf947cba77e143a31981295062f1aef6d494 (diff) |
Correct timebase for non-x86 CPUs on Darwin
Fixes: #368
Diffstat (limited to 'darwin')
-rw-r--r-- | darwin/DarwinProcess.c | 3 | ||||
-rw-r--r-- | darwin/Platform.c | 18 | ||||
-rw-r--r-- | darwin/Platform.h | 3 |
3 files changed, 22 insertions, 2 deletions
diff --git a/darwin/DarwinProcess.c b/darwin/DarwinProcess.c index 904df0bd..8a5be389 100644 --- a/darwin/DarwinProcess.c +++ b/darwin/DarwinProcess.c @@ -14,6 +14,7 @@ in the source distribution for its full text. #include <mach/mach.h> #include "CRT.h" +#include "Platform.h" #include "Process.h" @@ -248,7 +249,7 @@ void DarwinProcess_setFromLibprocPidinfo(DarwinProcess* proc, DarwinProcessList* uint64_t diff = (pti.pti_total_system - proc->stime) + (pti.pti_total_user - proc->utime); - proc->super.percent_cpu = (double)diff * (double)dpl->super.cpuCount + proc->super.percent_cpu = (double)diff * (double)dpl->super.cpuCount * Platform_timebaseToNS / ((double)dpl->global_diff * 100000.0); // fprintf(stderr, "%f %llu %llu %llu %llu %llu\n", proc->super.percent_cpu, diff --git a/darwin/Platform.c b/darwin/Platform.c index d22ba579..69cd32a4 100644 --- a/darwin/Platform.c +++ b/darwin/Platform.c @@ -6,6 +6,8 @@ Released under the GNU GPLv2, see the COPYING file in the source distribution for its full text. */ +#include "config.h" // IWYU pragma: keep + #include "Platform.h" #include <math.h> @@ -32,6 +34,10 @@ in the source distribution for its full text. #include "zfs/ZfsArcMeter.h" #include "zfs/ZfsCompressedArcMeter.h" +#ifdef HAVE_MACH_MACH_TIME_H +#include <mach/mach_time.h> +#endif + ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_VIRT, M_RESIDENT, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 }; @@ -135,8 +141,18 @@ const MeterClass* const Platform_meterTypes[] = { int Platform_numberOfFields = 100; +double Platform_timebaseToNS = 1.0; + void Platform_init(void) { - /* no platform-specific setup needed */ + // Check if we can determine the timebase used on this system. + // If the API is unavailable assume we get our timebase in nanoseconds. +#ifdef HAVE_MACH_TIMEBASE_INFO + mach_timebase_info_data_t info; + mach_timebase_info(&info); + Platform_timebaseToNS = (double)info.numer / (double)info.denom; +#else + Platform_timebaseToNS = 1.0; +#endif } void Platform_done(void) { diff --git a/darwin/Platform.h b/darwin/Platform.h index e1f83553..6213164c 100644 --- a/darwin/Platform.h +++ b/darwin/Platform.h @@ -19,12 +19,15 @@ in the source distribution for its full text. #include "ProcessLocksScreen.h" #include "SignalsPanel.h" + extern ProcessFieldData Process_fields[]; extern ProcessField Platform_defaultFields[]; extern int Platform_numberOfFields; +extern double Platform_timebaseToNS; + extern const SignalItem Platform_signals[]; extern const unsigned int Platform_numberOfSignals; |