summaryrefslogtreecommitdiffstats
path: root/solaris/SolarisProcessList.c
diff options
context:
space:
mode:
authorNathan Scott <nathans@redhat.com>2023-08-31 11:56:43 +1000
committerNathan Scott <nathans@redhat.com>2023-08-31 14:13:16 +1000
commitb74673fe37fd379fc350789e696470556776d815 (patch)
treecbe4f036962c439f9c07a9c96302f5908f6410b0 /solaris/SolarisProcessList.c
parent214166a049c2a6ac454dbb37b85b04c039a6a17a (diff)
Rename ProcessList to ProcessTable throughout
Following up with some discusson from a few months back, where it was proposed that ProcessTable is a better name. This data structure is definitely not a list ... if it was one-dimensional it'd be a set, but in practice it has much more in common with a two-dimensional table. The Process table is a familiar operating system concept for many people too so it resonates a little in that way as well.
Diffstat (limited to 'solaris/SolarisProcessList.c')
-rw-r--r--solaris/SolarisProcessList.c267
1 files changed, 0 insertions, 267 deletions
diff --git a/solaris/SolarisProcessList.c b/solaris/SolarisProcessList.c
deleted file mode 100644
index 46067a7b..00000000
--- a/solaris/SolarisProcessList.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
-htop - SolarisProcessList.c
-(C) 2014 Hisham H. Muhammad
-(C) 2017,2018 Guy M. Broome
-Released under the GNU GPLv2+, see the COPYING file
-in the source distribution for its full text.
-*/
-
-
-#include "solaris/SolarisProcessList.h"
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/user.h>
-#include <limits.h>
-#include <string.h>
-#include <procfs.h>
-#include <errno.h>
-#include <pwd.h>
-#include <math.h>
-#include <time.h>
-
-#include "CRT.h"
-#include "solaris/Platform.h"
-#include "solaris/SolarisProcess.h"
-
-
-#define GZONE "global "
-#define UZONE "unknown "
-
-static char* SolarisProcessList_readZoneName(kstat_ctl_t* kd, SolarisProcess* sproc) {
- char* zname;
-
- if ( sproc->zoneid == 0 ) {
- zname = xStrdup(GZONE);
- } else if ( kd == NULL ) {
- zname = xStrdup(UZONE);
- } else {
- kstat_t* ks = kstat_lookup_wrapper( kd, "zones", sproc->zoneid, NULL );
- zname = xStrdup(ks == NULL ? UZONE : ks->ks_name);
- }
-
- return zname;
-}
-
-ProcessList* ProcessList_new(Machine* host, Hashtable* pidMatchList) {
- SolarisProcessList* this = xCalloc(1, sizeof(SolarisProcessList));
- Object_setClass(this, Class(ProcessList));
-
- ProcessList* super = &this->super;
- ProcessList_init(super, Class(SolarisProcess), host, pidMatchList);
-
- return super;
-}
-
-void ProcessList_delete(Object* cast) {
- SolarisProcessList* this = (SolarisProcessList*) cast;
- ProcessList_done(&this->super);
- free(this);
-}
-
-static void SolarisProcessList_updateExe(pid_t pid, Process* proc) {
- char path[32];
- xSnprintf(path, sizeof(path), "/proc/%d/path/a.out", pid);
-
- char target[PATH_MAX];
- ssize_t ret = readlink(path, target, sizeof(target) - 1);
- if (ret <= 0)
- return;
-
- target[ret] = '\0';
- Process_updateExe(proc, target);
-}
-
-static void SolarisProcessList_updateCwd(pid_t pid, Process* proc) {
- char path[32];
- xSnprintf(path, sizeof(path), "/proc/%d/cwd", pid);
-
- char target[PATH_MAX];
- ssize_t ret = readlink(path, target, sizeof(target) - 1);
- if (ret <= 0)
- return;
-
- target[ret] = '\0';
- free_and_xStrdup(&proc->procCwd, target);
-}
-
-/* Taken from: https://docs.oracle.com/cd/E19253-01/817-6223/6mlkidlom/index.html#tbl-sched-state */
-static inline ProcessState SolarisProcessList_getProcessState(char state) {
- switch (state) {
- case 'S': return SLEEPING;
- case 'R': return RUNNABLE;
- case 'O': return RUNNING;
- case 'Z': return ZOMBIE;
- case 'T': return STOPPED;
- case 'I': return IDLE;
- default: return UNKNOWN;
- }
-}
-
-/* NOTE: the following is a callback function of type proc_walk_f
- * and MUST conform to the appropriate definition in order
- * to work. See libproc(3LIB) on a Solaris or Illumos
- * system for more info.
- */
-
-static int SolarisProcessList_walkproc(psinfo_t* _psinfo, lwpsinfo_t* _lwpsinfo, void* listptr) {
- bool preExisting;
- pid_t getpid;
-
- // Setup process list
- ProcessList* pl = (ProcessList*) listptr;
- SolarisProcessList* spl = (SolarisProcessList*) listptr;
- Machine* host = pl->host;
-
- id_t lwpid_real = _lwpsinfo->pr_lwpid;
- if (lwpid_real > 1023) {
- return 0;
- }
-
- pid_t lwpid = (_psinfo->pr_pid * 1024) + lwpid_real;
- bool onMasterLWP = (_lwpsinfo->pr_lwpid == _psinfo->pr_lwp.pr_lwpid);
- if (onMasterLWP) {
- getpid = _psinfo->pr_pid * 1024;
- } else {
- getpid = lwpid;
- }
-
- Process* proc = ProcessList_getProcess(pl, getpid, &preExisting, SolarisProcess_new);
- SolarisProcess* sproc = (SolarisProcess*) proc;
- const Settings* settings = host->settings;
-
- // Common code pass 1
- proc->show = false;
- sproc->taskid = _psinfo->pr_taskid;
- sproc->projid = _psinfo->pr_projid;
- sproc->poolid = _psinfo->pr_poolid;
- sproc->contid = _psinfo->pr_contract;
- proc->priority = _lwpsinfo->pr_pri;
- proc->nice = _lwpsinfo->pr_nice - NZERO;
- proc->processor = _lwpsinfo->pr_onpro;
- proc->state = SolarisProcessList_getProcessState(_lwpsinfo->pr_sname);
- // NOTE: This 'percentage' is a 16-bit BINARY FRACTIONS where 1.0 = 0x8000
- // Source: https://docs.oracle.com/cd/E19253-01/816-5174/proc-4/index.html
- // (accessed on 18 November 2017)
- proc->percent_mem = ((uint16_t)_psinfo->pr_pctmem / (double)32768) * (double)100.0;
- proc->pgrp = _psinfo->pr_pgid;
- proc->nlwp = _psinfo->pr_nlwp;
- proc->session = _psinfo->pr_sid;
-
- proc->tty_nr = _psinfo->pr_ttydev;
- const char* name = (_psinfo->pr_ttydev != PRNODEV) ? ttyname(_psinfo->pr_ttydev) : NULL;
- if (!name) {
- free(proc->tty_name);
- proc->tty_name = NULL;
- } else {
- free_and_xStrdup(&proc->tty_name, name);
- }
-
- proc->m_resident = _psinfo->pr_rssize; // KB
- proc->m_virt = _psinfo->pr_size; // KB
-
- if (proc->st_uid != _psinfo->pr_euid) {
- proc->st_uid = _psinfo->pr_euid;
- proc->user = UsersTable_getRef(host->usersTable, proc->st_uid);
- }
-
- if (!preExisting) {
- sproc->realpid = _psinfo->pr_pid;
- sproc->lwpid = lwpid_real;
- sproc->zoneid = _psinfo->pr_zoneid;
- sproc->zname = SolarisProcessList_readZoneName(spl->kd, sproc);
- SolarisProcessList_updateExe(_psinfo->pr_pid, proc);
-
- Process_updateComm(proc, _psinfo->pr_fname);
- Process_updateCmdline(proc, _psinfo->pr_psargs, 0, 0);
-
- if (settings->ss->flags & PROCESS_FLAG_CWD) {
- SolarisProcessList_updateCwd(_psinfo->pr_pid, proc);
- }
- }
-
- // End common code pass 1
-
- if (onMasterLWP) { // Are we on the representative LWP?
- Process_setParent(proc, (_psinfo->pr_ppid * 1024));
- Process_setThreadGroup(proc, (_psinfo->pr_ppid * 1024));
- sproc->realppid = _psinfo->pr_ppid;
- sproc->realtgid = _psinfo->pr_ppid;
-
- // See note above (in common section) about this BINARY FRACTION
- proc->percent_cpu = ((uint16_t)_psinfo->pr_pctcpu / (double)32768) * (double)100.0;
- Process_updateCPUFieldWidths(proc->percent_cpu);
-
- proc->time = _psinfo->pr_time.tv_sec * 100 + _psinfo->pr_time.tv_nsec / 10000000;
- if (!preExisting) { // Tasks done only for NEW processes
- proc->isUserlandThread = false;
- proc->starttime_ctime = _psinfo->pr_start.tv_sec;
- }
-
- // Update proc and thread counts based on settings
- if (proc->isKernelThread && !settings->hideKernelThreads) {
- pl->kernelThreads += proc->nlwp;
- pl->totalTasks += proc->nlwp + 1;
- if (proc->state == RUNNING) {
- pl->runningTasks++;
- }
- } else if (!proc->isKernelThread) {
- if (proc->state == RUNNING) {
- pl->runningTasks++;
- }
- if (settings->hideUserlandThreads) {
- pl->totalTasks++;
- } else {
- pl->userlandThreads += proc->nlwp;
- pl->totalTasks += proc->nlwp + 1;
- }
- }
- proc->show = !(settings->hideKernelThreads && proc->isKernelThread);
- } else { // We are not in the master LWP, so jump to the LWP handling code
- proc->percent_cpu = ((uint16_t)_lwpsinfo->pr_pctcpu / (double)32768) * (double)100.0;
- Process_updateCPUFieldWidths(proc->percent_cpu);
-
- proc->time = _lwpsinfo->pr_time.tv_sec * 100 + _lwpsinfo->pr_time.tv_nsec / 10000000;
- if (!preExisting) { // Tasks done only for NEW LWPs
- proc->isUserlandThread = true;
- Process_setParent(proc, _psinfo->pr_pid * 1024);
- Process_setThreadGroup(proc, _psinfo->pr_pid * 1024);
- sproc->realppid = _psinfo->pr_pid;
- sproc->realtgid = _psinfo->pr_pid;
- proc->starttime_ctime = _lwpsinfo->pr_start.tv_sec;
- }
-
- // Top-level process only gets this for the representative LWP
- if (proc->isKernelThread && !settings->hideKernelThreads) {
- proc->super.show = true;
- }
- if (!proc->isKernelThread && !settings->hideUserlandThreads) {
- proc->super.show = true;
- }
- } // Top-level LWP or subordinate LWP
-
- // Common code pass 2
-
- if (!preExisting) {
- if ((sproc->realppid <= 0) && !(sproc->realpid <= 1)) {
- proc->isKernelThread = true;
- } else {
- proc->isKernelThread = false;
- }
-
- Process_fillStarttimeBuffer(proc);
- ProcessList_add(pl, proc);
- }
-
- proc->super.updated = true;
-
- // End common code pass 2
-
- return 0;
-}
-
-void ProcessList_goThroughEntries(ProcessList* super) {
- super->kernelThreads = 1;
- proc_walk(&SolarisProcessList_walkproc, super, PR_WALK_LWP);
-}

© 2014-2024 Faster IT GmbH | imprint | privacy policy