2015-07-12 18:47:43 +00:00
/*
htop - darwin / Platform . c
( C ) 2014 Hisham H . Muhammad
( C ) 2015 David C . Hunt
Released under the GNU GPL , see the COPYING file
in the source distribution for its full text .
*/
# include "Platform.h"
# include "CPUMeter.h"
# include "MemoryMeter.h"
# include "SwapMeter.h"
# include "TasksMeter.h"
# include "LoadAverageMeter.h"
# include "ClockMeter.h"
# include "HostnameMeter.h"
# include "UptimeMeter.h"
2015-07-13 21:53:46 +00:00
# include "DarwinProcessList.h"
2015-07-12 18:47:43 +00:00
2015-07-13 06:17:14 +00:00
# include <stdlib.h>
2015-07-12 18:47:43 +00:00
/*{
# include "Action.h"
# include "BatteryMeter.h"
# include "DarwinProcess.h"
} */
ProcessField Platform_defaultFields [ ] = { PID , USER , PRIORITY , NICE , M_SIZE , M_RESIDENT , STATE , PERCENT_CPU , PERCENT_MEM , TIME , COMM , 0 } ;
ProcessFieldData Process_fields [ ] = {
[ 0 ] = { . name = " " , . title = NULL , . description = NULL , . flags = 0 , } ,
[ PID ] = { . name = " PID " , . title = " PID " , . description = " Process/thread ID " , . flags = 0 , } ,
[ COMM ] = { . name = " Command " , . title = " Command " , . description = " Command line " , . flags = 0 , } ,
[ STATE ] = { . name = " STATE " , . title = " S " , . description = " Process state (S sleeping, R running, D disk, Z zombie, T traced, W paging) " , . flags = 0 , } ,
[ PPID ] = { . name = " PPID " , . title = " PPID " , . description = " Parent process ID " , . flags = 0 , } ,
[ PGRP ] = { . name = " PGRP " , . title = " PGRP " , . description = " Process group ID " , . flags = 0 , } ,
[ SESSION ] = { . name = " SESSION " , . title = " SESN " , . description = " Process's session ID " , . flags = 0 , } ,
[ TTY_NR ] = { . name = " TTY_NR " , . title = " TTY " , . description = " Controlling terminal " , . flags = 0 , } ,
[ TPGID ] = { . name = " TPGID " , . title = " TPGID " , . description = " Process ID of the fg process group of the controlling terminal " , . flags = 0 , } ,
[ MINFLT ] = { . name = " MINFLT " , . title = " MINFLT " , . description = " Number of minor faults which have not required loading a memory page from disk " , . flags = 0 , } ,
[ MAJFLT ] = { . name = " MAJFLT " , . title = " MAJFLT " , . description = " Number of major faults which have required loading a memory page from disk " , . flags = 0 , } ,
[ PRIORITY ] = { . name = " PRIORITY " , . title = " PRI " , . description = " Kernel's internal priority for the process " , . flags = 0 , } ,
[ NICE ] = { . name = " NICE " , . title = " NI " , . description = " Nice value (the higher the value, the more it lets other processes take priority) " , . flags = 0 , } ,
[ STARTTIME ] = { . name = " STARTTIME " , . title = " START " , . description = " Time the process was started " , . flags = 0 , } ,
[ PROCESSOR ] = { . name = " PROCESSOR " , . title = " CPU " , . description = " Id of the CPU the process last executed on " , . flags = 0 , } ,
[ M_SIZE ] = { . name = " M_SIZE " , . title = " VIRT " , . description = " Total program size in virtual memory " , . flags = 0 , } ,
[ M_RESIDENT ] = { . name = " M_RESIDENT " , . title = " RES " , . description = " Resident set size, size of the text and data sections, plus stack usage " , . flags = 0 , } ,
[ ST_UID ] = { . name = " ST_UID " , . title = " UID " , . description = " User ID of the process owner " , . flags = 0 , } ,
[ PERCENT_CPU ] = { . name = " PERCENT_CPU " , . title = " CPU% " , . description = " Percentage of the CPU time the process used in the last sampling " , . flags = 0 , } ,
[ PERCENT_MEM ] = { . name = " PERCENT_MEM " , . title = " MEM% " , . description = " Percentage of the memory the process is using, based on resident memory size " , . flags = 0 , } ,
[ USER ] = { . name = " USER " , . title = " USER " , . description = " Username of the process owner (or user ID if name cannot be determined) " , . flags = 0 , } ,
[ TIME ] = { . name = " TIME " , . title = " TIME+ " , . description = " Total time the process has spent in user and system time " , . flags = 0 , } ,
[ NLWP ] = { . name = " NLWP " , . title = " NLWP " , . description = " Number of threads in the process " , . flags = 0 , } ,
[ TGID ] = { . name = " TGID " , . title = " TGID " , . description = " Thread group ID (i.e. process ID) " , . flags = 0 , } ,
[ 100 ] = { . name = " *** report bug! *** " , . title = NULL , . description = NULL , . flags = 0 , } ,
} ;
MeterClass * Platform_meterTypes [ ] = {
& CPUMeter_class ,
& ClockMeter_class ,
& LoadAverageMeter_class ,
& LoadMeter_class ,
& MemoryMeter_class ,
& TasksMeter_class ,
& BatteryMeter_class ,
& HostnameMeter_class ,
& UptimeMeter_class ,
& AllCPUsMeter_class ,
& AllCPUs2Meter_class ,
& LeftCPUsMeter_class ,
& RightCPUsMeter_class ,
& LeftCPUs2Meter_class ,
& RightCPUs2Meter_class ,
& BlankMeter_class ,
NULL
} ;
void Platform_setBindings ( Htop_Action * keys ) {
( void ) keys ;
}
int Platform_numberOfFields = 100 ;
char * Process_pidFormat = " %7u " ;
char * Process_tpgidFormat = " %7u " ;
int Platform_getUptime ( ) {
2015-08-19 16:56:46 +00:00
struct timeval bootTime , currTime ;
int mib [ 2 ] = { CTL_KERN , KERN_BOOTTIME } ;
size_t size = sizeof ( bootTime ) ;
2015-07-14 02:02:40 +00:00
2015-08-19 16:56:46 +00:00
int err = sysctl ( mib , 2 , & bootTime , & size , NULL , 0 ) ;
if ( err ) {
return - 1 ;
}
gettimeofday ( & currTime , NULL ) ;
2015-07-14 02:02:40 +00:00
2015-08-19 16:56:46 +00:00
return ( int ) difftime ( currTime . tv_sec , bootTime . tv_sec ) ;
2015-07-12 18:47:43 +00:00
}
void Platform_getLoadAverage ( double * one , double * five , double * fifteen ) {
2015-07-13 06:17:14 +00:00
double results [ 3 ] ;
if ( 3 = = getloadavg ( results , 3 ) ) {
* one = results [ 0 ] ;
* five = results [ 1 ] ;
* fifteen = results [ 2 ] ;
} else {
* one = 0 ;
* five = 0 ;
* fifteen = 0 ;
}
2015-07-12 18:47:43 +00:00
}
int Platform_getMaxPid ( ) {
2015-07-13 06:17:14 +00:00
/* http://opensource.apple.com/source/xnu/xnu-2782.1.97/bsd/sys/proc_internal.hh */
return 99999 ;
2015-07-12 18:47:43 +00:00
}
void Process_setupColumnWidths ( ) {
int maxPid = Platform_getMaxPid ( ) ;
if ( maxPid = = - 1 ) return ;
if ( maxPid > 99999 ) {
Process_fields [ PID ] . title = " PID " ;
Process_fields [ PPID ] . title = " PPID " ;
Process_fields [ TPGID ] . title = " TPGID " ;
Process_fields [ TGID ] . title = " TGID " ;
Process_fields [ PGRP ] . title = " PGRP " ;
Process_fields [ SESSION ] . title = " SESN " ;
Process_pidFormat = " %7u " ;
Process_tpgidFormat = " %7d " ;
} else {
Process_fields [ PID ] . title = " PID " ;
Process_fields [ PPID ] . title = " PPID " ;
Process_fields [ TPGID ] . title = " TPGID " ;
Process_fields [ TGID ] . title = " TGID " ;
Process_fields [ PGRP ] . title = " PGRP " ;
Process_fields [ SESSION ] . title = " SESN " ;
Process_pidFormat = " %5u " ;
Process_tpgidFormat = " %5d " ;
}
}
2015-07-13 21:53:46 +00:00
double Platform_setCPUValues ( Meter * mtr , int cpu ) {
2015-08-19 16:56:46 +00:00
/* All just from CPUMeter.c */
static const int CPU_METER_NICE = 0 ;
static const int CPU_METER_NORMAL = 1 ;
static const int CPU_METER_KERNEL = 2 ;
DarwinProcessList * dpl = ( DarwinProcessList * ) mtr - > pl ;
processor_cpu_load_info_t prev = & dpl - > prev_load [ cpu - 1 ] ;
processor_cpu_load_info_t curr = & dpl - > curr_load [ cpu - 1 ] ;
double total = 0 ;
/* Take the sums */
for ( size_t i = 0 ; i < CPU_STATE_MAX ; + + i ) {
total + = ( double ) curr - > cpu_ticks [ i ] - ( double ) prev - > cpu_ticks [ i ] ;
}
2015-07-12 18:47:43 +00:00
2015-08-19 16:56:46 +00:00
mtr - > values [ CPU_METER_NICE ]
= ( ( double ) curr - > cpu_ticks [ CPU_STATE_NICE ] - ( double ) prev - > cpu_ticks [ CPU_STATE_NICE ] ) * 100.0 / total ;
mtr - > values [ CPU_METER_NORMAL ]
= ( ( double ) curr - > cpu_ticks [ CPU_STATE_USER ] - ( double ) prev - > cpu_ticks [ CPU_STATE_USER ] ) * 100.0 / total ;
mtr - > values [ CPU_METER_KERNEL ]
= ( ( double ) curr - > cpu_ticks [ CPU_STATE_SYSTEM ] - ( double ) prev - > cpu_ticks [ CPU_STATE_SYSTEM ] ) * 100.0 / total ;
2015-07-14 02:02:40 +00:00
2015-08-19 16:56:46 +00:00
Meter_setItems ( mtr , 3 ) ;
2015-07-14 02:02:40 +00:00
2015-08-19 16:56:46 +00:00
/* Convert to percent and return */
total = mtr - > values [ CPU_METER_NICE ] + mtr - > values [ CPU_METER_NORMAL ] + mtr - > values [ CPU_METER_KERNEL ] ;
return MIN ( 100.0 , MAX ( 0.0 , total ) ) ;
}
void Platform_setMemoryValues ( Meter * mtr ) {
DarwinProcessList * dpl = ( DarwinProcessList * ) mtr - > pl ;
vm_statistics64_t vm = & dpl - > vm_stats ;
double page_K = ( double ) vm_page_size / ( double ) 1024 ;
mtr - > total = dpl - > host_info . max_mem / 1024 ;
mtr - > values [ 0 ] = ( double ) ( vm - > active_count + vm - > wire_count ) * page_K ;
mtr - > values [ 1 ] = ( double ) vm - > purgeable_count * page_K ;
mtr - > values [ 2 ] = ( double ) vm - > inactive_count * page_K ;
2015-07-12 18:47:43 +00:00
}
void Platform_setSwapValues ( Meter * this ) {
}