mirror of
https://github.com/xzeldon/htop.git
synced 2025-07-12 12:14:36 +03:00
Tidy up process state handling
This commit is contained in:
@ -542,60 +542,61 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
|
||||
}
|
||||
|
||||
// would be nice if we could store multiple states in proc->state (as enum) and have writeField render them
|
||||
/* Taken from: https://github.com/DragonFlyBSD/DragonFlyBSD/blob/c163a4d7ee9c6857ee4e04a3a2cbb50c3de29da1/sys/sys/proc_common.h */
|
||||
switch (kproc->kp_stat) {
|
||||
case SIDL: proc->state = 'I'; isIdleProcess = true; break;
|
||||
case SIDL: proc->state = IDLE; isIdleProcess = true; break;
|
||||
case SACTIVE:
|
||||
switch (kproc->kp_lwp.kl_stat) {
|
||||
case LSSLEEP:
|
||||
if (kproc->kp_lwp.kl_flags & LWP_SINTR) // interruptible wait short/long
|
||||
if (kproc->kp_lwp.kl_slptime >= MAXSLP) {
|
||||
proc->state = 'I';
|
||||
proc->state = IDLE;
|
||||
isIdleProcess = true;
|
||||
} else {
|
||||
proc->state = 'S';
|
||||
proc->state = SLEEPING;
|
||||
}
|
||||
else if (kproc->kp_lwp.kl_tdflags & TDF_SINTR) // interruptible lwkt wait
|
||||
proc->state = 'S';
|
||||
proc->state = SLEEPING;
|
||||
else if (kproc->kp_paddr) // uninterruptible wait
|
||||
proc->state = 'D';
|
||||
proc->state = UNINTERRUPTIBLE_WAIT;
|
||||
else // uninterruptible lwkt wait
|
||||
proc->state = 'B';
|
||||
proc->state = UNINTERRUPTIBLE_WAIT;
|
||||
break;
|
||||
case LSRUN:
|
||||
if (kproc->kp_lwp.kl_stat == LSRUN) {
|
||||
if (!(kproc->kp_lwp.kl_tdflags & (TDF_RUNNING | TDF_RUNQ)))
|
||||
proc->state = 'Q';
|
||||
proc->state = QUEUED;
|
||||
else
|
||||
proc->state = 'R';
|
||||
proc->state = RUNNING;
|
||||
}
|
||||
break;
|
||||
case LSSTOP:
|
||||
proc->state = 'T';
|
||||
proc->state = STOPPED;
|
||||
break;
|
||||
default:
|
||||
proc->state = 'A';
|
||||
proc->state = PAGING;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SSTOP: proc->state = 'T'; break;
|
||||
case SZOMB: proc->state = 'Z'; break;
|
||||
case SCORE: proc->state = 'C'; break;
|
||||
default: proc->state = '?';
|
||||
case SSTOP: proc->state = STOPPED; break;
|
||||
case SZOMB: proc->state = ZOMBIE; break;
|
||||
case SCORE: proc->state = BLOCKED; break;
|
||||
default: proc->state = UNKNOWN;
|
||||
}
|
||||
|
||||
if (kproc->kp_flags & P_SWAPPEDOUT)
|
||||
proc->state = 'W';
|
||||
proc->state = SLEEPING;
|
||||
if (kproc->kp_flags & P_TRACED)
|
||||
proc->state = 'T';
|
||||
proc->state = TRACED;
|
||||
if (kproc->kp_flags & P_JAILED)
|
||||
proc->state = 'J';
|
||||
proc->state = TRACED;
|
||||
|
||||
if (Process_isKernelThread(proc))
|
||||
super->kernelThreads++;
|
||||
|
||||
super->totalTasks++;
|
||||
|
||||
if (proc->state == 'R')
|
||||
if (proc->state == RUNNING)
|
||||
super->runningTasks++;
|
||||
|
||||
proc->show = ! ((hideKernelThreads && Process_isKernelThread(proc)) || (hideUserlandThreads && Process_isUserlandThread(proc)));
|
||||
|
Reference in New Issue
Block a user