Merge branch 'fix_mach_timebase' of benbe/htop

This commit is contained in:
Daniel Lange 2020-12-13 20:02:38 +01:00
commit 4b1a4a4ebd
4 changed files with 45 additions and 17 deletions

View File

@ -240,6 +240,11 @@ else
AC_SEARCH_LIBS([keypad], [tinfo]) AC_SEARCH_LIBS([keypad], [tinfo])
fi fi
if test "$my_htop_platform" = "darwin"; then
AC_CHECK_HEADERS([mach/mach_time.h])
AC_CHECK_FUNCS([mach_timebase_info])
fi
if test "$my_htop_platform" = "freebsd"; then if test "$my_htop_platform" = "freebsd"; then
AC_CHECK_LIB([kvm], [kvm_open], [], [missing_libraries="$missing_libraries libkvm"]) AC_CHECK_LIB([kvm], [kvm_open], [], [missing_libraries="$missing_libraries libkvm"])
fi fi

View File

@ -14,6 +14,7 @@ in the source distribution for its full text.
#include <mach/mach.h> #include <mach/mach.h>
#include "CRT.h" #include "CRT.h"
#include "Platform.h"
#include "Process.h" #include "Process.h"
@ -308,7 +309,7 @@ void DarwinProcess_setFromLibprocPidinfo(DarwinProcess* proc, DarwinProcessList*
uint64_t diff = (pti.pti_total_system - proc->stime) uint64_t diff = (pti.pti_total_system - proc->stime)
+ (pti.pti_total_user - proc->utime); + (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); / ((double)dpl->global_diff * 100000.0);
// fprintf(stderr, "%f %llu %llu %llu %llu %llu\n", proc->super.percent_cpu, // fprintf(stderr, "%f %llu %llu %llu %llu %llu\n", proc->super.percent_cpu,

View File

@ -6,22 +6,9 @@ Released under the GNU GPLv2, see the COPYING file
in the source distribution for its full text. in the source distribution for its full text.
*/ */
#include "config.h" // IWYU pragma: keep
#include "Platform.h" #include "Platform.h"
#include "Macros.h"
#include "CPUMeter.h"
#include "MemoryMeter.h"
#include "SwapMeter.h"
#include "TasksMeter.h"
#include "LoadAverageMeter.h"
#include "ClockMeter.h"
#include "DateMeter.h"
#include "DateTimeMeter.h"
#include "HostnameMeter.h"
#include "ProcessLocksScreen.h"
#include "UptimeMeter.h"
#include "zfs/ZfsArcMeter.h"
#include "zfs/ZfsCompressedArcMeter.h"
#include "DarwinProcessList.h"
#include <math.h> #include <math.h>
#include <stdlib.h> #include <stdlib.h>
@ -31,6 +18,27 @@ in the source distribution for its full text.
#include <IOKit/ps/IOPowerSources.h> #include <IOKit/ps/IOPowerSources.h>
#include <IOKit/ps/IOPSKeys.h> #include <IOKit/ps/IOPSKeys.h>
#include "ClockMeter.h"
#include "CPUMeter.h"
#include "DarwinProcessList.h"
#include "DateMeter.h"
#include "DateTimeMeter.h"
#include "HostnameMeter.h"
#include "LoadAverageMeter.h"
#include "Macros.h"
#include "MemoryMeter.h"
#include "ProcessLocksScreen.h"
#include "SwapMeter.h"
#include "TasksMeter.h"
#include "UptimeMeter.h"
#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 }; ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_VIRT, M_RESIDENT, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 };
const SignalItem Platform_signals[] = { const SignalItem Platform_signals[] = {
@ -104,8 +112,18 @@ const MeterClass* const Platform_meterTypes[] = {
int Platform_numberOfFields = LAST_PROCESSFIELD; int Platform_numberOfFields = LAST_PROCESSFIELD;
double Platform_timebaseToNS = 1.0;
void Platform_init(void) { 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) { void Platform_done(void) {

View File

@ -19,10 +19,14 @@ in the source distribution for its full text.
#include "ProcessLocksScreen.h" #include "ProcessLocksScreen.h"
#include "SignalsPanel.h" #include "SignalsPanel.h"
extern ProcessFieldData Process_fields[];
extern ProcessField Platform_defaultFields[]; extern ProcessField Platform_defaultFields[];
extern int Platform_numberOfFields; extern int Platform_numberOfFields;
extern double Platform_timebaseToNS;
extern const SignalItem Platform_signals[]; extern const SignalItem Platform_signals[];
extern const unsigned int Platform_numberOfSignals; extern const unsigned int Platform_numberOfSignals;