2015-03-16 06:13:42 +00:00
/*
htop - FreeBSDProcess . c
( C ) 2015 Hisham H . Muhammad
2020-10-05 07:51:32 +00:00
Released under the GNU GPLv2 , see the COPYING file
2015-03-16 06:13:42 +00:00
in the source distribution for its full text .
*/
# include "FreeBSDProcess.h"
# include <stdlib.h>
2020-11-18 14:12:18 +00:00
# include "CRT.h"
# include "Macros.h"
# include "Process.h"
# include "RichString.h"
# include "XUtils.h"
2015-03-16 06:13:42 +00:00
2020-10-21 11:56:26 +00:00
const char * const nodevStr = " nodev " ;
2015-03-16 06:13:42 +00:00
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 , } ,
2017-02-04 23:10:29 +00:00
[ SESSION ] = { . name = " SESSION " , . title = " SID " , . description = " Process's session ID " , . flags = 0 , } ,
2020-10-21 11:56:26 +00:00
[ TTY_NR ] = { . name = " TTY_NR " , . title = " TTY " , . description = " Controlling terminal " , . flags = PROCESS_FLAG_FREEBSD_TTY , } ,
2015-03-16 06:13:42 +00:00
[ 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 , } ,
2015-03-17 02:01:48 +00:00
[ PROCESSOR ] = { . name = " PROCESSOR " , . title = " CPU " , . description = " Id of the CPU the process last executed on " , . flags = 0 , } ,
2020-11-20 16:09:34 +00:00
[ M_VIRT ] = { . name = " M_VIRT " , . title = " VIRT " , . description = " Total program size in virtual memory " , . flags = 0 , } ,
2015-03-16 06:13:42 +00:00
[ M_RESIDENT ] = { . name = " M_RESIDENT " , . title = " RES " , . description = " Resident set size, size of the text and data sections, plus stack usage " , . flags = 0 , } ,
2018-10-07 09:16:12 +00:00
[ ST_UID ] = { . name = " ST_UID " , . title = " UID " , . description = " User ID of the process owner " , . flags = 0 , } ,
2015-03-16 06:13:42 +00:00
[ PERCENT_CPU ] = { . name = " PERCENT_CPU " , . title = " CPU% " , . description = " Percentage of the CPU time the process used in the last sampling " , . flags = 0 , } ,
2020-10-30 16:02:20 +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 , } ,
2015-03-16 06:13:42 +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 , } ,
[ 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 , } ,
2015-09-30 20:04:26 +00:00
[ JID ] = { . name = " JID " , . title = " JID " , . description = " Jail prison ID " , . flags = 0 , } ,
[ JAIL ] = { . name = " JAIL " , . title = " JAIL " , . description = " Jail prison name " , . flags = 0 , } ,
2015-03-16 06:13:42 +00:00
[ LAST_PROCESSFIELD ] = { . name = " *** report bug! *** " , . title = NULL , . description = NULL , . flags = 0 , } ,
} ;
2015-08-20 03:32:47 +00:00
ProcessPidColumn Process_pidColumns [ ] = {
2015-09-30 20:04:26 +00:00
{ . id = JID , . label = " JID " } ,
2015-08-20 03:32:47 +00:00
{ . id = PID , . label = " PID " } ,
{ . id = PPID , . label = " PPID " } ,
{ . id = TPGID , . label = " TPGID " } ,
{ . id = TGID , . label = " TGID " } ,
{ . id = PGRP , . label = " PGRP " } ,
2017-01-31 23:03:55 +00:00
{ . id = SESSION , . label = " SID " } ,
2015-08-20 03:32:47 +00:00
{ . id = 0 , . label = NULL } ,
} ;
2015-03-16 06:13:42 +00:00
2020-10-21 19:26:05 +00:00
Process * FreeBSDProcess_new ( const Settings * settings ) {
2016-02-02 14:53:02 +00:00
FreeBSDProcess * this = xCalloc ( 1 , sizeof ( FreeBSDProcess ) ) ;
2015-04-09 18:40:27 +00:00
Object_setClass ( this , Class ( FreeBSDProcess ) ) ;
2015-03-16 06:13:42 +00:00
Process_init ( & this - > super , settings ) ;
2020-10-21 19:26:05 +00:00
return & this - > super ;
2015-03-16 06:13:42 +00:00
}
void Process_delete ( Object * cast ) {
FreeBSDProcess * this = ( FreeBSDProcess * ) cast ;
Process_done ( ( Process * ) cast ) ;
2015-09-30 20:04:26 +00:00
free ( this - > jname ) ;
2015-03-16 06:13:42 +00:00
free ( this ) ;
}
2020-10-21 17:11:26 +00:00
static void FreeBSDProcess_writeField ( const Process * this , RichString * str , ProcessField field ) {
2020-10-21 19:26:01 +00:00
const FreeBSDProcess * fp = ( const FreeBSDProcess * ) this ;
2015-03-16 06:13:42 +00:00
char buffer [ 256 ] ; buffer [ 255 ] = ' \0 ' ;
int attr = CRT_colors [ DEFAULT_COLOR ] ;
2015-09-30 20:04:26 +00:00
int n = sizeof ( buffer ) - 1 ;
2016-02-12 18:09:50 +00:00
switch ( ( int ) field ) {
2015-03-16 06:13:42 +00:00
// add FreeBSD-specific fields here
2017-07-27 19:07:50 +00:00
case JID : xSnprintf ( buffer , n , Process_pidFormat , fp - > jid ) ; break ;
2020-10-31 22:28:02 +00:00
case JAIL : {
2019-04-17 09:06:37 +00:00
xSnprintf ( buffer , n , " %-11s " , fp - > jname ) ;
2015-09-30 20:04:26 +00:00
if ( buffer [ 11 ] ! = ' \0 ' ) {
buffer [ 11 ] = ' ' ;
buffer [ 12 ] = ' \0 ' ;
}
break ;
}
2020-10-21 11:56:26 +00:00
case TTY_NR :
if ( fp - > ttyPath ) {
if ( fp - > ttyPath = = nodevStr )
attr = CRT_colors [ PROCESS_SHADOW ] ;
xSnprintf ( buffer , n , " %-8s " , fp - > ttyPath ) ;
} else {
attr = CRT_colors [ PROCESS_SHADOW ] ;
xSnprintf ( buffer , n , " ? " ) ;
}
break ;
2015-03-16 06:13:42 +00:00
default :
2015-04-09 18:40:27 +00:00
Process_writeField ( this , str , field ) ;
2015-03-16 06:13:42 +00:00
return ;
}
2020-12-04 13:44:57 +00:00
RichString_appendWide ( str , attr , buffer ) ;
2015-03-16 06:13:42 +00:00
}
2020-10-21 17:11:26 +00:00
static long FreeBSDProcess_compare ( const void * v1 , const void * v2 ) {
2020-10-04 12:30:35 +00:00
const FreeBSDProcess * p1 , * p2 ;
const Settings * settings = ( ( const Process * ) v1 ) - > settings ;
2020-11-04 16:46:24 +00:00
2015-03-16 06:13:42 +00:00
if ( settings - > direction = = 1 ) {
2020-10-04 12:30:35 +00:00
p1 = ( const FreeBSDProcess * ) v1 ;
p2 = ( const FreeBSDProcess * ) v2 ;
2015-03-16 06:13:42 +00:00
} else {
2020-10-04 12:30:35 +00:00
p2 = ( const FreeBSDProcess * ) v1 ;
p1 = ( const FreeBSDProcess * ) v2 ;
2015-03-16 06:13:42 +00:00
}
2020-11-04 16:46:24 +00:00
2016-02-12 18:09:50 +00:00
switch ( ( int ) settings - > sortKey ) {
2015-03-16 06:13:42 +00:00
// add FreeBSD-specific fields here
2015-09-30 20:04:26 +00:00
case JID :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NUMBER ( p1 - > jid , p2 - > jid ) ;
2015-09-30 20:04:26 +00:00
case JAIL :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NULLSTR ( p1 - > jname , p2 - > jname ) ;
2020-10-21 11:56:26 +00:00
case TTY_NR :
2020-11-04 16:46:24 +00:00
return SPACESHIP_NULLSTR ( p1 - > ttyPath , p2 - > ttyPath ) ;
2015-03-16 06:13:42 +00:00
default :
2015-04-09 18:40:27 +00:00
return Process_compare ( v1 , v2 ) ;
2015-03-16 06:13:42 +00:00
}
}
2020-10-07 17:02:15 +00:00
bool Process_isThread ( const Process * this ) {
const FreeBSDProcess * fp = ( const FreeBSDProcess * ) this ;
2015-09-30 20:04:26 +00:00
2020-11-01 00:09:51 +00:00
if ( fp - > kernel = = 1 ) {
2015-09-30 20:04:26 +00:00
return 1 ;
2020-11-01 00:09:51 +00:00
} else {
2020-10-21 17:11:26 +00:00
return Process_isUserlandThread ( this ) ;
2020-11-01 00:09:51 +00:00
}
2015-03-16 06:13:42 +00:00
}
2020-10-21 17:11:26 +00:00
const ProcessClass FreeBSDProcess_class = {
. super = {
. extends = Class ( Process ) ,
. display = Process_display ,
. delete = Process_delete ,
. compare = FreeBSDProcess_compare
} ,
. writeField = FreeBSDProcess_writeField ,
} ;