2018-03-02 21:20:46 +00:00
/*
htop - SolarisProcess . c
( C ) 2015 Hisham H . Muhammad
2018-03-05 21:52:03 +00:00
( C ) 2017 , 2018 Guy M . Broome
2021-09-22 09:33:00 +00:00
Released under the GNU GPLv2 + , see the COPYING file
2018-03-02 21:20:46 +00:00
in the source distribution for its full text .
*/
2021-04-03 18:49:45 +00:00
# include "solaris/SolarisProcess.h"
2018-03-02 21:20:46 +00:00
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <sys/syscall.h>
2021-04-03 18:49:45 +00:00
# include "Process.h"
# include "ProcessList.h"
# include "CRT.h"
# include "solaris/Platform.h"
2018-03-02 21:20:46 +00:00
2020-12-15 18:44:52 +00:00
const ProcessFieldData Process_fields [ LAST_PROCESSFIELD ] = {
2018-03-02 21:20:46 +00:00
[ 0 ] = { . name = " " , . title = NULL , . description = NULL , . flags = 0 , } ,
2020-12-15 18:44:52 +00:00
[ PID ] = { . name = " PID " , . title = " PID " , . description = " Process/thread ID " , . flags = 0 , . pidColumn = true , } ,
2018-03-02 21:20:46 +00:00
[ COMM ] = { . name = " Command " , . title = " Command " , . description = " Command line " , . flags = 0 , } ,
2018-04-05 13:46:00 +00:00
[ STATE ] = { . name = " STATE " , . title = " S " , . description = " Process state (S sleeping, R running, O onproc, Z zombie, T stopped, W waiting) " , . flags = 0 , } ,
2020-12-15 18:44:52 +00:00
[ PPID ] = { . name = " PPID " , . title = " PPID " , . description = " Parent process ID " , . flags = 0 , . pidColumn = true , } ,
[ PGRP ] = { . name = " PGRP " , . title = " PGRP " , . description = " Process group ID " , . flags = 0 , . pidColumn = true , } ,
[ SESSION ] = { . name = " SESSION " , . title = " SID " , . description = " Process's session ID " , . flags = 0 , . pidColumn = true , } ,
2021-03-21 18:40:56 +00:00
[ TTY ] = { . name = " TTY " , . title = " TTY " , . description = " Controlling terminal " , . flags = 0 , } ,
2021-05-20 15:54:17 +00:00
//[TPGID] = { .name = "TPGID", .title = "TPGID", .description = "Process ID of the fg process group of the controlling terminal", .flags = 0, .pidColumn = true, },
//[MINFLT] = { .name = "MINFLT", .title = " MINFLT ", .description = "Number of minor faults which have not required loading a memory page from disk", .flags = 0, .defaultSortDesc = true, },
//[MAJFLT] = { .name = "MAJFLT", .title = " MAJFLT ", .description = "Number of major faults which have required loading a memory page from disk", .flags = 0, .defaultSortDesc = true, },
2018-03-02 21:20:46 +00:00
[ 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 , } ,
2021-05-02 11:29:39 +00:00
[ ELAPSED ] = { . name = " ELAPSED " , . title = " ELAPSED " , . description = " Time since the process was started " , . flags = 0 , } ,
2018-03-02 21:20:46 +00:00
[ PROCESSOR ] = { . name = " PROCESSOR " , . title = " CPU " , . description = " Id of the CPU the process last executed on " , . flags = 0 , } ,
2021-01-21 13:27:23 +00:00
[ M_VIRT ] = { . name = " M_VIRT " , . title = " VIRT " , . description = " Total program size in virtual memory " , . flags = 0 , . defaultSortDesc = true , } ,
[ M_RESIDENT ] = { . name = " M_RESIDENT " , . title = " RES " , . description = " Resident set size, size of the text and data sections, plus stack usage " , . flags = 0 , . defaultSortDesc = true , } ,
2021-08-16 20:50:36 +00:00
[ ST_UID ] = { . name = " ST_UID " , . title = " UID " , . description = " User ID of the process owner " , . flags = 0 , } ,
2022-04-14 11:05:02 +00:00
[ PERCENT_CPU ] = { . name = " PERCENT_CPU " , . title = " CPU% " , . description = " Percentage of the CPU time the process used in the last sampling " , . flags = 0 , . defaultSortDesc = true , . autoWidth = true , } ,
2022-02-27 19:29:40 +00:00
[ PERCENT_NORM_CPU ] = { . name = " PERCENT_NORM_CPU " , . title = " NCPU% " , . description = " Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count) " , . flags = 0 , . defaultSortDesc = true , . autoWidth = true , } ,
2021-01-21 13:27:23 +00:00
[ PERCENT_MEM ] = { . name = " PERCENT_MEM " , . title = " MEM% " , . description = " Percentage of the memory the process is using, based on resident memory size " , . flags = 0 , . defaultSortDesc = true , } ,
2021-08-16 20:50:36 +00:00
[ USER ] = { . name = " USER " , . title = " USER " , . description = " Username of the process owner (or user ID if name cannot be determined) " , . flags = 0 , } ,
2021-01-21 13:27:23 +00:00
[ TIME ] = { . name = " TIME " , . title = " TIME+ " , . description = " Total time the process has spent in user and system time " , . flags = 0 , . defaultSortDesc = true , } ,
2018-03-02 21:20:46 +00:00
[ NLWP ] = { . name = " NLWP " , . title = " NLWP " , . description = " Number of threads in the process " , . flags = 0 , } ,
2020-12-15 18:44:52 +00:00
[ TGID ] = { . name = " TGID " , . title = " TGID " , . description = " Thread group ID (i.e. process ID) " , . flags = 0 , . pidColumn = true , } ,
2021-05-19 15:43:38 +00:00
[ PROC_COMM ] = { . name = " COMM " , . title = " COMM " , . description = " comm string of the process " , . flags = 0 , } ,
[ PROC_EXE ] = { . name = " EXE " , . title = " EXE " , . description = " Basename of exe of the process " , . flags = 0 , } ,
2021-05-25 17:11:56 +00:00
[ CWD ] = { . name = " CWD " , . title = " CWD " , . description = " The current working directory of the process " , . flags = PROCESS_FLAG_CWD , } ,
2021-05-19 15:43:38 +00:00
[ ZONEID ] = { . name = " ZONEID " , . title = " ZONEID " , . description = " Zone ID " , . flags = 0 , . pidColumn = true , } ,
2018-03-02 21:20:46 +00:00
[ ZONE ] = { . name = " ZONE " , . title = " ZONE " , . description = " Zone name " , . flags = 0 , } ,
2020-12-15 18:44:52 +00:00
[ PROJID ] = { . name = " PROJID " , . title = " PRJID " , . description = " Project ID " , . flags = 0 , . pidColumn = true , } ,
[ TASKID ] = { . name = " TASKID " , . title = " TSKID " , . description = " Task ID " , . flags = 0 , . pidColumn = true , } ,
[ POOLID ] = { . name = " POOLID " , . title = " POLID " , . description = " Pool ID " , . flags = 0 , . pidColumn = true , } ,
[ CONTID ] = { . name = " CONTID " , . title = " CNTID " , . description = " Contract ID " , . flags = 0 , . pidColumn = true , } ,
[ LWPID ] = { . name = " LWPID " , . title = " LWPID " , . description = " LWP ID " , . flags = 0 , . pidColumn = true , } ,
2018-03-02 21:20:46 +00:00
} ;
2020-10-21 19:26:05 +00:00
Process * SolarisProcess_new ( const Settings * settings ) {
2018-03-02 21:20:46 +00:00
SolarisProcess * this = xCalloc ( 1 , sizeof ( SolarisProcess ) ) ;
Object_setClass ( this , Class ( SolarisProcess ) ) ;
Process_init ( & this - > super , settings ) ;
2020-10-21 19:26:05 +00:00
return & this - > super ;
2018-03-02 21:20:46 +00:00
}
void Process_delete ( Object * cast ) {
2018-03-30 18:34:12 +00:00
SolarisProcess * sp = ( SolarisProcess * ) cast ;
2018-03-02 21:20:46 +00:00
Process_done ( ( Process * ) cast ) ;
2018-03-30 18:34:12 +00:00
free ( sp - > zname ) ;
free ( sp ) ;
2018-03-02 21:20:46 +00:00
}
2021-01-09 19:17:31 +00:00
static void SolarisProcess_writeField ( const Process * this , RichString * str , ProcessField field ) {
2020-10-21 19:26:01 +00:00
const SolarisProcess * sp = ( const SolarisProcess * ) this ;
2018-03-02 21:20:46 +00:00
char buffer [ 256 ] ; buffer [ 255 ] = ' \0 ' ;
int attr = CRT_colors [ DEFAULT_COLOR ] ;
int n = sizeof ( buffer ) - 1 ;
2020-12-15 18:44:48 +00:00
switch ( field ) {
2018-03-02 21:20:46 +00:00
// add Solaris-specific fields here
2020-12-15 18:44:52 +00:00
case ZONEID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > zoneid ) ; break ;
case PROJID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > projid ) ; break ;
case TASKID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > taskid ) ; break ;
case POOLID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > poolid ) ; break ;
case CONTID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > contid ) ; break ;
2021-01-10 14:57:46 +00:00
case ZONE : Process_printLeftAlignedField ( str , attr , sp - > zname ? sp - > zname : " global " , ZONENAME_MAX / 4 ) ; return ;
2020-12-15 18:44:52 +00:00
case PID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > realpid ) ; break ;
case PPID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > realppid ) ; break ;
2021-05-20 15:54:17 +00:00
case TGID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > realtgid ) ; break ;
2020-12-15 18:44:52 +00:00
case LWPID : xSnprintf ( buffer , n , " %*d " , Process_pidDigits , sp - > lwpid ) ; break ;
2018-03-02 21:20:46 +00:00
default :
Process_writeField ( this , str , field ) ;
return ;
}
2020-12-04 13:44:57 +00:00
RichString_appendWide ( str , attr , buffer ) ;
2018-03-02 21:20:46 +00:00
}
2021-01-09 19:17:31 +00:00
static int SolarisProcess_compareByKey ( const Process * v1 , const Process * v2 , ProcessField key ) {
2020-12-17 23:09:55 +00:00
const SolarisProcess * p1 = ( const SolarisProcess * ) v1 ;
const SolarisProcess * p2 = ( const SolarisProcess * ) v2 ;
2020-11-04 16:46:24 +00:00
2020-12-15 18:44:48 +00:00
switch ( key ) {
2018-03-02 21:20:46 +00:00
case ZONEID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > zoneid , p2 - > zoneid ) ;
2018-03-02 21:20:46 +00:00
case PROJID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > projid , p2 - > projid ) ;
2018-03-02 21:20:46 +00:00
case TASKID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > taskid , p2 - > taskid ) ;
2018-03-02 21:20:46 +00:00
case POOLID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > poolid , p2 - > poolid ) ;
2018-03-02 21:20:46 +00:00
case CONTID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > contid , p2 - > contid ) ;
2018-03-02 21:20:46 +00:00
case ZONE :
return strcmp ( p1 - > zname ? p1 - > zname : " global " , p2 - > zname ? p2 - > zname : " global " ) ;
2018-03-27 16:27:12 +00:00
case PID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > realpid , p2 - > realpid ) ;
2018-03-27 16:27:12 +00:00
case PPID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > realppid , p2 - > realppid ) ;
2018-03-27 16:27:12 +00:00
case LWPID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > lwpid , p2 - > lwpid ) ;
2018-03-02 21:20:46 +00:00
default :
2020-12-18 21:12:26 +00:00
return Process_compareByKey_Base ( v1 , v2 , key ) ;
2018-03-02 21:20:46 +00:00
}
}
2021-01-09 19:17:31 +00:00
const ProcessClass SolarisProcess_class = {
. super = {
. extends = Class ( Process ) ,
. display = Process_display ,
. delete = Process_delete ,
. compare = Process_compare
} ,
. writeField = SolarisProcess_writeField ,
. compareByKey = SolarisProcess_compareByKey
} ;