Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
htop
Commits
be1700cf
Commit
be1700cf
authored
10 years ago
by
Hisham Muhammad
Browse files
Options
Download
Email Patches
Plain Diff
Isolate portable and Linux-specific process fields.
parent
bc928d7f
master
darwin-cpu-average
fixedgray
freebsd
linear-graph-scan
lua
next
perfcounters
pkgconfig-on-linux
solaris
sreclaimable
travis-ci
wip
3.0.0beta5
3.0.0beta4
3.0.0beta3
3.0.0beta2
3.0.0beta1
2.2.0
2.1.0
2.0.2
2.0.1
2.0.0
No related merge requests found
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
AvailableColumnsPanel.c
+1
-1
AvailableColumnsPanel.c
ColumnsPanel.c
+1
-1
ColumnsPanel.c
Process.c
+119
-224
Process.c
Process.h
+43
-57
Process.h
Settings.c
+1
-5
Settings.c
linux/LinuxProcess.c
+263
-85
linux/LinuxProcess.c
linux/LinuxProcess.h
+98
-13
linux/LinuxProcess.h
linux/LinuxProcessList.c
+70
-65
linux/LinuxProcessList.c
linux/Platform.c
+5
-2
linux/Platform.c
linux/Platform.h
+1
-1
linux/Platform.h
with
602 additions
and
454 deletions
+602
-454
AvailableColumnsPanel.c
View file @
be1700cf
...
...
@@ -75,7 +75,7 @@ AvailableColumnsPanel* AvailableColumnsPanel_new(Panel* columns) {
Panel_setHeader
(
super
,
"Available Columns"
);
for
(
int
i
=
1
;
i
<
LAST_PROCESSFIELD
;
i
++
)
{
for
(
int
i
=
1
;
i
<
Platform_numberOfFields
;
i
++
)
{
if
(
i
!=
COMM
&&
Process_fields
[
i
].
description
)
{
char
description
[
256
];
snprintf
(
description
,
sizeof
(
description
),
"%s - %s"
,
Process_fields
[
i
].
name
,
Process_fields
[
i
].
description
);
...
...
This diff is collapsed.
Click to expand it.
ColumnsPanel.c
View file @
be1700cf
...
...
@@ -135,7 +135,7 @@ ColumnsPanel* ColumnsPanel_new(Settings* settings) {
}
int
ColumnsPanel_fieldNameToIndex
(
const
char
*
name
)
{
for
(
int
j
=
1
;
j
<=
LAST_PROCESSFIELD
;
j
++
)
{
for
(
int
j
=
1
;
j
<=
Platform_numberOfFields
;
j
++
)
{
if
(
String_eq
(
name
,
Process_fields
[
j
].
name
))
{
return
j
;
}
...
...
This diff is collapsed.
Click to expand it.
Process.c
View file @
be1700cf
...
...
@@ -41,26 +41,40 @@ in the source distribution for its full text.
#define PROCESS_FLAG_IO 0x0001
#ifndef Process_isKernelThread
#define Process_isKernelThread(_process) (_process->pgrp == 0)
#endif
#ifndef Process_isUserlandThread
#define Process_isUserlandThread(_process) (_process->pid != _process->tgid)
#endif
#ifndef Process_isThread
#define Process_isThread(_process) (Process_isUserlandThread(_process) || Process_isKernelThread(_process))
#endif
typedef int ProcessField;
typedef enum ProcessFields {
PID = 1,
COMM = 2,
STATE = 3,
PPID = 4,
PGRP = 5,
SESSION = 6,
TTY_NR = 7,
TPGID = 8,
MINFLT = 10,
MAJFLT = 12,
PRIORITY = 18,
NICE = 19,
STARTTIME = 21,
M_SIZE = 39,
M_RESIDENT = 40,
ST_UID = 46,
PERCENT_CPU = 47,
PERCENT_MEM = 48,
USER = 49,
TIME = 50,
NLWP = 51,
TGID = 52,
} ProcessField;
typedef struct Process_ {
Object super;
struct Settings_* settings;
unsigned long long int time;
pid_t pid;
pid_t ppid;
pid_t tgid;
char* comm;
int indent;
...
...
@@ -71,73 +85,30 @@ typedef struct Process_ {
bool tag;
bool showChildren;
bool show;
pid_t ppid;
unsigned int pgrp;
unsigned int session;
unsigned int tty_nr;
pid_t tgid;
int tpgid;
uid_t st_uid;
unsigned long int flags;
uid_t st_uid;
float percent_cpu;
float percent_mem;
char* user;
unsigned long long int utime;
unsigned long long int stime;
unsigned long long int cutime;
unsigned long long int cstime;
long int priority;
long int nice;
long int nlwp;
char starttime_show[8];
time_t starttime_ctime;
#ifdef HAVE_TASKSTATS
unsigned long long io_rchar;
unsigned long long io_wchar;
unsigned long long io_syscr;
unsigned long long io_syscw;
unsigned long long io_read_bytes;
unsigned long long io_write_bytes;
unsigned long long io_cancelled_write_bytes;
unsigned long long io_rate_read_time;
unsigned long long io_rate_write_time;
double io_rate_read_bps;
double io_rate_write_bps;
#endif
int processor;
long m_size;
long m_resident;
long m_share;
long m_trs;
long m_drs;
long m_lrs;
long m_dt;
#ifdef HAVE_OPENVZ
unsigned int ctid;
unsigned int vpid;
#endif
#ifdef HAVE_VSERVER
unsigned int vxid;
#endif
#ifdef HAVE_CGROUP
char* cgroup;
#endif
#ifdef HAVE_OOM
unsigned int oom;
#endif
int exit_signal;
unsigned long int minflt;
unsigned long int cminflt;
unsigned long int majflt;
unsigned long int cmajflt;
#ifdef DEBUG
long int itrealvalue;
unsigned long int vsize;
...
...
@@ -166,8 +137,15 @@ typedef struct ProcessFieldData_ {
int flags;
} ProcessFieldData;
// Implemented in platform-specific code:
void Process_setupColumnWidths();
void Process_writeField(Process* this, RichString* str, ProcessField field);
long Process_compare(const void* v1, const void* v2);
void Process_delete(Object* cast);
bool Process_isThread(Process* this);
extern ProcessFieldData Process_fields[];
extern char* Process_pidFormat;
extern char* Process_tpgidFormat;
}*/
...
...
@@ -181,7 +159,7 @@ static int Process_getuid = -1;
#define ONE_DECIMAL_M (ONE_DECIMAL_K * ONE_DECIMAL_K)
#define ONE_DECIMAL_G (ONE_DECIMAL_M * ONE_DECIMAL_K)
static
void
Process_humanNumber
(
RichString
*
str
,
unsigned
long
number
,
bool
coloring
)
{
void
Process_humanNumber
(
RichString
*
str
,
unsigned
long
number
,
bool
coloring
)
{
char
buffer
[
11
];
int
len
;
...
...
@@ -229,7 +207,7 @@ static void Process_humanNumber(RichString* str, unsigned long number, bool colo
RichString_appendn
(
str
,
processColor
,
buffer
,
len
);
}
static
void
Process_colorNumber
(
RichString
*
str
,
unsigned
long
long
number
,
bool
coloring
)
{
void
Process_colorNumber
(
RichString
*
str
,
unsigned
long
long
number
,
bool
coloring
)
{
char
buffer
[
14
];
int
largeNumberColor
=
CRT_colors
[
LARGE_NUMBER
];
...
...
@@ -258,7 +236,7 @@ static void Process_colorNumber(RichString* str, unsigned long long number, bool
static
double
jiffy
=
0
.
0
;
static
void
Process_printTime
(
RichString
*
str
,
unsigned
long
long
t
)
{
void
Process_printTime
(
RichString
*
str
,
unsigned
long
long
t
)
{
if
(
jiffy
==
0
.
0
)
jiffy
=
sysconf
(
_SC_CLK_TCK
);
double
jiffytime
=
1
.
0
/
jiffy
;
...
...
@@ -307,7 +285,7 @@ static inline void Process_writeCommand(Process* this, int attr, int baseattr, R
}
}
static
inline
void
Process_outputRate
(
RichString
*
str
,
char
*
buffer
,
int
n
,
double
rate
,
int
coloring
)
{
void
Process_outputRate
(
RichString
*
str
,
char
*
buffer
,
int
n
,
double
rate
,
int
coloring
)
{
int
largeNumberColor
=
CRT_colors
[
LARGE_NUMBER
];
int
processMegabytesColor
=
CRT_colors
[
PROCESS_MEGABYTES
];
int
processColor
=
CRT_colors
[
PROCESS
];
...
...
@@ -338,19 +316,24 @@ void Process_writeDefaultField(Process* this, RichString* str, ProcessField fiel
bool
coloring
=
this
->
settings
->
highlightMegabytes
;
switch
(
field
)
{
case
PID
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
pid
);
break
;
case
PPID
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
ppid
);
break
;
case
PGRP
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
pgrp
);
break
;
case
SESSION
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
session
);
break
;
case
TTY_NR
:
snprintf
(
buffer
,
n
,
"%5u "
,
this
->
tty_nr
);
break
;
case
TGID
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
tgid
);
break
;
case
TPGID
:
snprintf
(
buffer
,
n
,
Process_tpgidFormat
,
this
->
tpgid
);
break
;
case
MINFLT
:
Process_colorNumber
(
str
,
this
->
minflt
,
coloring
);
return
;
case
CMINFLT
:
Process_colorNumber
(
str
,
this
->
cminflt
,
coloring
);
return
;
case
MAJFLT
:
Process_colorNumber
(
str
,
this
->
majflt
,
coloring
);
return
;
case
CMAJFLT
:
Process_colorNumber
(
str
,
this
->
cmajflt
,
coloring
);
return
;
case
PROCESSOR
:
snprintf
(
buffer
,
n
,
"%3d "
,
Settings_cpuId
(
this
->
settings
,
this
->
processor
));
break
;
case
NLWP
:
snprintf
(
buffer
,
n
,
"%4ld "
,
this
->
nlwp
);
break
;
case
PERCENT_CPU
:
{
if
(
this
->
percent_cpu
>
999
.
9
)
{
snprintf
(
buffer
,
n
,
"%4d "
,
(
unsigned
int
)
this
->
percent_cpu
);
}
else
if
(
this
->
percent_cpu
>
99
.
9
)
{
snprintf
(
buffer
,
n
,
"%3d. "
,
(
unsigned
int
)
this
->
percent_cpu
);
}
else
{
snprintf
(
buffer
,
n
,
"%4.1f "
,
this
->
percent_cpu
);
}
break
;
}
case
PERCENT_MEM
:
{
if
(
this
->
percent_mem
>
99
.
9
)
{
snprintf
(
buffer
,
n
,
"100. "
);
}
else
{
snprintf
(
buffer
,
n
,
"%4.1f "
,
this
->
percent_mem
);
}
break
;
}
case
COMM
:
{
if
(
this
->
settings
->
highlightThreads
&&
Process_isThread
(
this
))
{
attr
=
CRT_colors
[
PROCESS_THREAD
];
...
...
@@ -384,6 +367,30 @@ void Process_writeDefaultField(Process* this, RichString* str, ProcessField fiel
return
;
}
}
case
MAJFLT
:
Process_colorNumber
(
str
,
this
->
majflt
,
coloring
);
return
;
case
MINFLT
:
Process_colorNumber
(
str
,
this
->
minflt
,
coloring
);
return
;
case
M_RESIDENT
:
Process_humanNumber
(
str
,
this
->
m_resident
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
M_SIZE
:
Process_humanNumber
(
str
,
this
->
m_size
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
NICE
:
{
snprintf
(
buffer
,
n
,
"%3ld "
,
this
->
nice
);
attr
=
this
->
nice
<
0
?
CRT_colors
[
PROCESS_HIGH_PRIORITY
]
:
this
->
nice
>
0
?
CRT_colors
[
PROCESS_LOW_PRIORITY
]
:
attr
;
break
;
}
case
NLWP
:
snprintf
(
buffer
,
n
,
"%4ld "
,
this
->
nlwp
);
break
;
case
PGRP
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
pgrp
);
break
;
case
PID
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
pid
);
break
;
case
PPID
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
ppid
);
break
;
case
PRIORITY
:
{
if
(
this
->
priority
==
-
100
)
snprintf
(
buffer
,
n
,
" RT "
);
else
snprintf
(
buffer
,
n
,
"%3ld "
,
this
->
priority
);
break
;
}
case
SESSION
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
session
);
break
;
case
STARTTIME
:
snprintf
(
buffer
,
n
,
"%s"
,
this
->
starttime_show
);
break
;
case
STATE
:
{
snprintf
(
buffer
,
n
,
"%c "
,
this
->
state
);
switch
(
this
->
state
)
{
...
...
@@ -396,28 +403,11 @@ void Process_writeDefaultField(Process* this, RichString* str, ProcessField fiel
}
break
;
}
case
PRIORITY
:
{
if
(
this
->
priority
==
-
100
)
snprintf
(
buffer
,
n
,
" RT "
);
else
snprintf
(
buffer
,
n
,
"%3ld "
,
this
->
priority
);
break
;
}
case
NICE
:
{
snprintf
(
buffer
,
n
,
"%3ld "
,
this
->
nice
);
attr
=
this
->
nice
<
0
?
CRT_colors
[
PROCESS_HIGH_PRIORITY
]
:
this
->
nice
>
0
?
CRT_colors
[
PROCESS_LOW_PRIORITY
]
:
attr
;
break
;
}
case
M_DRS
:
Process_humanNumber
(
str
,
this
->
m_drs
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
M_DT
:
Process_humanNumber
(
str
,
this
->
m_dt
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
M_LRS
:
Process_humanNumber
(
str
,
this
->
m_lrs
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
M_TRS
:
Process_humanNumber
(
str
,
this
->
m_trs
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
M_SIZE
:
Process_humanNumber
(
str
,
this
->
m_size
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
M_RESIDENT
:
Process_humanNumber
(
str
,
this
->
m_resident
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
M_SHARE
:
Process_humanNumber
(
str
,
this
->
m_share
*
PAGE_SIZE_KB
,
coloring
);
return
;
case
ST_UID
:
snprintf
(
buffer
,
n
,
"%4d "
,
this
->
st_uid
);
break
;
case
TIME
:
Process_printTime
(
str
,
this
->
time
);
return
;
case
TGID
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
tgid
);
break
;
case
TPGID
:
snprintf
(
buffer
,
n
,
Process_tpgidFormat
,
this
->
tpgid
);
break
;
case
TTY_NR
:
snprintf
(
buffer
,
n
,
"%5u "
,
this
->
tty_nr
);
break
;
case
USER
:
{
if
(
Process_getuid
!=
(
int
)
this
->
st_uid
)
attr
=
CRT_colors
[
PROCESS_SHADOW
];
...
...
@@ -432,55 +422,6 @@ void Process_writeDefaultField(Process* this, RichString* str, ProcessField fiel
}
break
;
}
case
UTIME
:
Process_printTime
(
str
,
this
->
utime
);
return
;
case
STIME
:
Process_printTime
(
str
,
this
->
stime
);
return
;
case
CUTIME
:
Process_printTime
(
str
,
this
->
cutime
);
return
;
case
CSTIME
:
Process_printTime
(
str
,
this
->
cstime
);
return
;
case
TIME
:
Process_printTime
(
str
,
this
->
utime
+
this
->
stime
);
return
;
case
PERCENT_CPU
:
{
if
(
this
->
percent_cpu
>
999
.
9
)
{
snprintf
(
buffer
,
n
,
"%4d "
,
(
unsigned
int
)
this
->
percent_cpu
);
}
else
if
(
this
->
percent_cpu
>
99
.
9
)
{
snprintf
(
buffer
,
n
,
"%3d. "
,
(
unsigned
int
)
this
->
percent_cpu
);
}
else
{
snprintf
(
buffer
,
n
,
"%4.1f "
,
this
->
percent_cpu
);
}
break
;
}
case
PERCENT_MEM
:
{
if
(
this
->
percent_mem
>
99
.
9
)
{
snprintf
(
buffer
,
n
,
"100. "
);
}
else
{
snprintf
(
buffer
,
n
,
"%4.1f "
,
this
->
percent_mem
);
}
break
;
}
case
STARTTIME
:
snprintf
(
buffer
,
n
,
"%s"
,
this
->
starttime_show
);
break
;
#ifdef HAVE_OPENVZ
case
CTID
:
snprintf
(
buffer
,
n
,
"%7u "
,
this
->
ctid
);
break
;
case
VPID
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
vpid
);
break
;
#endif
#ifdef HAVE_VSERVER
case
VXID
:
snprintf
(
buffer
,
n
,
"%5u "
,
this
->
vxid
);
break
;
#endif
#ifdef HAVE_TASKSTATS
case
RCHAR
:
Process_colorNumber
(
str
,
this
->
io_rchar
,
coloring
);
return
;
case
WCHAR
:
Process_colorNumber
(
str
,
this
->
io_wchar
,
coloring
);
return
;
case
SYSCR
:
Process_colorNumber
(
str
,
this
->
io_syscr
,
coloring
);
return
;
case
SYSCW
:
Process_colorNumber
(
str
,
this
->
io_syscw
,
coloring
);
return
;
case
RBYTES
:
Process_colorNumber
(
str
,
this
->
io_read_bytes
,
coloring
);
return
;
case
WBYTES
:
Process_colorNumber
(
str
,
this
->
io_write_bytes
,
coloring
);
return
;
case
CNCLWB
:
Process_colorNumber
(
str
,
this
->
io_cancelled_write_bytes
,
coloring
);
return
;
case
IO_READ_RATE
:
Process_outputRate
(
str
,
buffer
,
n
,
this
->
io_rate_read_bps
,
coloring
);
return
;
case
IO_WRITE_RATE
:
Process_outputRate
(
str
,
buffer
,
n
,
this
->
io_rate_write_bps
,
coloring
);
return
;
case
IO_RATE
:
Process_outputRate
(
str
,
buffer
,
n
,
this
->
io_rate_read_bps
+
this
->
io_rate_write_bps
,
coloring
);
return
;
#endif
#ifdef HAVE_CGROUP
case
CGROUP
:
snprintf
(
buffer
,
n
,
"%-10s "
,
this
->
cgroup
);
break
;
#endif
#ifdef HAVE_OOM
case
OOM
:
snprintf
(
buffer
,
n
,
Process_pidFormat
,
this
->
oom
);
break
;
#endif
default:
snprintf
(
buffer
,
n
,
"- "
);
}
...
...
@@ -503,9 +444,6 @@ static void Process_display(Object* cast, RichString* out) {
void
Process_done
(
Process
*
this
)
{
assert
(
this
!=
NULL
);
free
(
this
->
comm
);
#ifdef HAVE_CGROUP
free
(
this
->
cgroup
);
#endif
}
ObjectClass
Process_class
=
{
...
...
@@ -516,20 +454,12 @@ ObjectClass Process_class = {
};
void
Process_init
(
Process
*
this
,
struct
Settings_
*
settings
)
{
this
->
pid
=
0
;
this
->
settings
=
settings
;
this
->
tag
=
false
;
this
->
showChildren
=
true
;
this
->
show
=
true
;
this
->
updated
=
false
;
this
->
utime
=
0
;
this
->
stime
=
0
;
this
->
comm
=
NULL
;
this
->
basenameOffset
=
-
1
;
this
->
indent
=
0
;
#ifdef HAVE_CGROUP
this
->
cgroup
=
NULL
;
#endif
if
(
Process_getuid
==
-
1
)
Process_getuid
=
getuid
();
}
...
...
@@ -570,91 +500,56 @@ long Process_defaultCompare(const void* v1, const void* v2) {
p2
=
(
Process
*
)
v1
;
p1
=
(
Process
*
)
v2
;
}
long
long
diff
;
switch
(
settings
->
sortKey
)
{
case
PID
:
return
(
p1
->
pid
-
p2
->
pid
);
case
PPID
:
return
(
p1
->
ppid
-
p2
->
ppid
);
case
USER
:
return
strcmp
(
p1
->
user
?
p1
->
user
:
""
,
p2
->
user
?
p2
->
user
:
""
);
case
PRIORITY
:
return
(
p1
->
priority
-
p2
->
priority
);
case
PROCESSOR
:
return
(
p1
->
processor
-
p2
->
processor
);
case
SESSION
:
return
(
p1
->
session
-
p2
->
session
);
case
STATE
:
return
(
p1
->
state
-
p2
->
state
);
case
NICE
:
return
(
p1
->
nice
-
p2
->
nice
);
case
M_DRS
:
return
(
p2
->
m_drs
-
p1
->
m_drs
);
case
M_DT
:
return
(
p2
->
m_dt
-
p1
->
m_dt
);
case
M_LRS
:
return
(
p2
->
m_lrs
-
p1
->
m_lrs
);
case
M_TRS
:
return
(
p2
->
m_trs
-
p1
->
m_trs
);
case
M_SIZE
:
return
(
p2
->
m_size
-
p1
->
m_size
);
case
M_RESIDENT
:
return
(
p2
->
m_resident
-
p1
->
m_resident
);
case
M_SHARE
:
return
(
p2
->
m_share
-
p1
->
m_share
);
case
PERCENT_CPU
:
return
(
p2
->
percent_cpu
>
p1
->
percent_cpu
?
1
:
-
1
);
case
PERCENT_MEM
:
return
(
p2
->
m_resident
-
p1
->
m_resident
);
case
UTIME
:
diff
=
p2
->
utime
-
p1
->
utime
;
goto
test_diff
;
case
CUTIME
:
diff
=
p2
->
cutime
-
p1
->
cutime
;
goto
test_diff
;
case
STIME
:
diff
=
p2
->
stime
-
p1
->
stime
;
goto
test_diff
;
case
CSTIME
:
diff
=
p2
->
cstime
-
p2
->
cstime
;
goto
test_diff
;
case
TIME
:
return
((
p2
->
utime
+
p2
->
stime
)
-
(
p1
->
utime
+
p1
->
stime
));
case
COMM
:
return
strcmp
(
p1
->
comm
,
p2
->
comm
);
case
MAJFLT
:
return
(
p2
->
majflt
-
p1
->
majflt
);
case
MINFLT
:
return
(
p2
->
minflt
-
p1
->
minflt
);
case
M_RESIDENT
:
return
(
p2
->
m_resident
-
p1
->
m_resident
);
case
M_SIZE
:
return
(
p2
->
m_size
-
p1
->
m_size
);
case
NICE
:
return
(
p1
->
nice
-
p2
->
nice
);
case
NLWP
:
return
(
p1
->
nlwp
-
p2
->
nlwp
);
case
PGRP
:
return
(
p1
->
pgrp
-
p2
->
pgrp
);
case
PID
:
return
(
p1
->
pid
-
p2
->
pid
);
case
PPID
:
return
(
p1
->
ppid
-
p2
->
ppid
);
case
PRIORITY
:
return
(
p1
->
priority
-
p2
->
priority
);
case
SESSION
:
return
(
p1
->
session
-
p2
->
session
);
case
STARTTIME
:
{
if
(
p1
->
starttime_ctime
==
p2
->
starttime_ctime
)
return
(
p1
->
pid
-
p2
->
pid
);
else
return
(
p1
->
starttime_ctime
-
p2
->
starttime_ctime
);
}
#ifdef HAVE_OPENVZ
case
CTID
:
return
(
p1
->
ctid
-
p2
->
ctid
);
case
VPID
:
return
(
p1
->
vpid
-
p2
->
vpid
);
#endif
#ifdef HAVE_VSERVER
case
VXID
:
return
(
p1
->
vxid
-
p2
->
vxid
);
#endif
#ifdef HAVE_TASKSTATS
case
RCHAR
:
diff
=
p2
->
io_rchar
-
p1
->
io_rchar
;
goto
test_diff
;
case
WCHAR
:
diff
=
p2
->
io_wchar
-
p1
->
io_wchar
;
goto
test_diff
;
case
SYSCR
:
diff
=
p2
->
io_syscr
-
p1
->
io_syscr
;
goto
test_diff
;
case
SYSCW
:
diff
=
p2
->
io_syscw
-
p1
->
io_syscw
;
goto
test_diff
;
case
RBYTES
:
diff
=
p2
->
io_read_bytes
-
p1
->
io_read_bytes
;
goto
test_diff
;
case
WBYTES
:
diff
=
p2
->
io_write_bytes
-
p1
->
io_write_bytes
;
goto
test_diff
;
case
CNCLWB
:
diff
=
p2
->
io_cancelled_write_bytes
-
p1
->
io_cancelled_write_bytes
;
goto
test_diff
;
case
IO_READ_RATE
:
diff
=
p2
->
io_rate_read_bps
-
p1
->
io_rate_read_bps
;
goto
test_diff
;
case
IO_WRITE_RATE
:
diff
=
p2
->
io_rate_write_bps
-
p1
->
io_rate_write_bps
;
goto
test_diff
;
case
IO_RATE
:
diff
=
(
p2
->
io_rate_read_bps
+
p2
->
io_rate_write_bps
)
-
(
p1
->
io_rate_read_bps
+
p1
->
io_rate_write_bps
);
goto
test_diff
;
#endif
#ifdef HAVE_CGROUP
case
CGROUP
:
return
strcmp
(
p1
->
cgroup
?
p1
->
cgroup
:
""
,
p2
->
cgroup
?
p2
->
cgroup
:
""
);
#endif
#ifdef HAVE_OOM
case
OOM
:
return
(
p1
->
oom
-
p2
->
oom
);
#endif
case
STATE
:
return
(
p1
->
state
-
p2
->
state
);
case
ST_UID
:
return
(
p1
->
st_uid
-
p2
->
st_uid
);
case
TIME
:
return
((
p2
->
time
)
-
(
p1
->
time
));
case
TGID
:
return
(
p1
->
tgid
-
p2
->
tgid
);
case
TPGID
:
return
(
p1
->
tpgid
-
p2
->
tpgid
);
case
TTY_NR
:
return
(
p1
->
tty_nr
-
p2
->
tty_nr
);
case
USER
:
return
strcmp
(
p1
->
user
?
p1
->
user
:
""
,
p2
->
user
?
p2
->
user
:
""
);
default:
return
(
p1
->
pid
-
p2
->
pid
);
}
test_diff:
return
(
diff
>
0
)
?
1
:
(
diff
<
0
?
-
1
:
0
);
}
This diff is collapsed.
Click to expand it.
Process.h
View file @
be1700cf
...
...
@@ -22,26 +22,40 @@ in the source distribution for its full text.
#define PROCESS_FLAG_IO 0x0001
#ifndef Process_isKernelThread
#define Process_isKernelThread(_process) (_process->pgrp == 0)
#endif
#ifndef Process_isUserlandThread
#define Process_isUserlandThread(_process) (_process->pid != _process->tgid)
#endif
#ifndef Process_isThread
#define Process_isThread(_process) (Process_isUserlandThread(_process) || Process_isKernelThread(_process))
#endif
typedef
int
ProcessField
;
typedef
enum
ProcessFields
{
PID
=
1
,
COMM
=
2
,
STATE
=
3
,
PPID
=
4
,
PGRP
=
5
,
SESSION
=
6
,
TTY_NR
=
7
,
TPGID
=
8
,
MINFLT
=
10
,
MAJFLT
=
12
,
PRIORITY
=
18
,
NICE
=
19
,
STARTTIME
=
21
,
M_SIZE
=
39
,
M_RESIDENT
=
40
,
ST_UID
=
46
,
PERCENT_CPU
=
47
,
PERCENT_MEM
=
48
,
USER
=
49
,
TIME
=
50
,
NLWP
=
51
,
TGID
=
52
,
}
ProcessField
;
typedef
struct
Process_
{
Object
super
;
struct
Settings_
*
settings
;
unsigned
long
long
int
time
;
pid_t
pid
;
pid_t
ppid
;
pid_t
tgid
;
char
*
comm
;
int
indent
;
...
...
@@ -52,73 +66,30 @@ typedef struct Process_ {
bool
tag
;
bool
showChildren
;
bool
show
;
pid_t
ppid
;
unsigned
int
pgrp
;
unsigned
int
session
;
unsigned
int
tty_nr
;
pid_t
tgid
;
int
tpgid
;
uid_t
st_uid
;
unsigned
long
int
flags
;
uid_t
st_uid
;
float
percent_cpu
;
float
percent_mem
;
char
*
user
;
unsigned
long
long
int
utime
;
unsigned
long
long
int
stime
;
unsigned
long
long
int
cutime
;
unsigned
long
long
int
cstime
;
long
int
priority
;
long
int
nice
;
long
int
nlwp
;
char
starttime_show
[
8
];
time_t
starttime_ctime
;
#ifdef HAVE_TASKSTATS
unsigned
long
long
io_rchar
;
unsigned
long
long
io_wchar
;
unsigned
long
long
io_syscr
;
unsigned
long
long
io_syscw
;
unsigned
long
long
io_read_bytes
;
unsigned
long
long
io_write_bytes
;
unsigned
long
long
io_cancelled_write_bytes
;
unsigned
long
long
io_rate_read_time
;
unsigned
long
long
io_rate_write_time
;
double
io_rate_read_bps
;
double
io_rate_write_bps
;
#endif
int
processor
;
long
m_size
;
long
m_resident
;
long
m_share
;
long
m_trs
;
long
m_drs
;
long
m_lrs
;
long
m_dt
;
#ifdef HAVE_OPENVZ
unsigned
int
ctid
;
unsigned
int
vpid
;
#endif
#ifdef HAVE_VSERVER
unsigned
int
vxid
;
#endif
#ifdef HAVE_CGROUP
char
*
cgroup
;
#endif
#ifdef HAVE_OOM
unsigned
int
oom
;
#endif
int
exit_signal
;
unsigned
long
int
minflt
;
unsigned
long
int
cminflt
;
unsigned
long
int
majflt
;
unsigned
long
int
cmajflt
;
#ifdef DEBUG
long
int
itrealvalue
;
unsigned
long
int
vsize
;
...
...
@@ -147,8 +118,15 @@ typedef struct ProcessFieldData_ {
int
flags
;
}
ProcessFieldData
;
// Implemented in platform-specific code:
void
Process_setupColumnWidths
();
void
Process_writeField
(
Process
*
this
,
RichString
*
str
,
ProcessField
field
);
long
Process_compare
(
const
void
*
v1
,
const
void
*
v2
);
void
Process_delete
(
Object
*
cast
);
bool
Process_isThread
(
Process
*
this
);
extern
ProcessFieldData
Process_fields
[];
extern
char
*
Process_pidFormat
;
extern
char
*
Process_tpgidFormat
;
#define ONE_K 1024L
...
...
@@ -159,6 +137,14 @@ long Process_compare(const void* v1, const void* v2);
#define ONE_DECIMAL_M (ONE_DECIMAL_K * ONE_DECIMAL_K)
#define ONE_DECIMAL_G (ONE_DECIMAL_M * ONE_DECIMAL_K)
void
Process_humanNumber
(
RichString
*
str
,
unsigned
long
number
,
bool
coloring
);
void
Process_colorNumber
(
RichString
*
str
,
unsigned
long
long
number
,
bool
coloring
);
void
Process_printTime
(
RichString
*
str
,
unsigned
long
long
t
);
void
Process_outputRate
(
RichString
*
str
,
char
*
buffer
,
int
n
,
double
rate
,
int
coloring
);
void
Process_writeDefaultField
(
Process
*
this
,
RichString
*
str
,
ProcessField
field
);
void
Process_done
(
Process
*
this
);
...
...
This diff is collapsed.
Click to expand it.
Settings.c
View file @
be1700cf
...
...
@@ -65,10 +65,6 @@ typedef struct Settings_ {
}*/
static
ProcessField
defaultFields
[]
=
{
PID
,
USER
,
PRIORITY
,
NICE
,
M_SIZE
,
M_RESIDENT
,
M_SHARE
,
STATE
,
PERCENT_CPU
,
PERCENT_MEM
,
TIME
,
COMM
,
0
};
//static ProcessField defaultIoFields[] = { PID, IO_PRIORITY, USER, IO_READ_RATE, IO_WRITE_RATE, IO_RATE, COMM, 0 };
void
Settings_delete
(
Settings
*
this
)
{
free
(
this
->
filename
);
free
(
this
->
fields
);
...
...
@@ -315,7 +311,7 @@ Settings* Settings_new(int cpuCount) {
// TODO: turn 'fields' into a Vector,
// (and ProcessFields into proper objects).
this
->
flags
=
0
;
ProcessField
*
defaults
=
defaultFields
;
ProcessField
*
defaults
=
Platform_
defaultFields
;
for
(
int
i
=
0
;
defaults
[
i
];
i
++
)
{
this
->
fields
[
i
]
=
defaults
[
i
];
this
->
flags
|=
Process_fields
[
defaults
[
i
]].
flags
;
...
...
This diff is collapsed.
Click to expand it.
linux/LinuxProcess.c
View file @
be1700cf
This diff is collapsed.
Click to expand it.
linux/LinuxProcess.h
View file @
be1700cf
...
...
@@ -15,28 +15,66 @@ in the source distribution for its full text.
#define PROCESS_FLAG_LINUX_VSERVER 0x0400
#define PROCESS_FLAG_LINUX_CGROUP 0x0800
typedef
enum
UnsupportedProcessFields
{
FLAGS
=
9
,
ITREALVALUE
=
20
,
VSIZE
=
22
,
RSS
=
23
,
RLIM
=
24
,
STARTCODE
=
25
,
ENDCODE
=
26
,
STARTSTACK
=
27
,
KSTKESP
=
28
,
KSTKEIP
=
29
,
SIGNAL
=
30
,
BLOCKED
=
31
,
SSIGIGNORE
=
32
,
SIGCATCH
=
33
,
WCHAN
=
34
,
NSWAP
=
35
,
CNSWAP
=
36
,
EXIT_SIGNAL
=
37
,
}
UnsupportedProcessField
;
typedef
enum
LinuxProcessFields
{
PID
=
1
,
COMM
,
STATE
,
PPID
,
PGRP
,
SESSION
,
TTY_NR
,
TPGID
,
FLAGS
,
MINFLT
,
CMINFLT
,
MAJFLT
,
CMAJFLT
,
UTIME
,
STIME
,
CUTIME
,
CSTIME
,
PRIORITY
,
NICE
,
ITREALVALUE
,
STARTTIME
,
VSIZE
,
RSS
,
RLIM
,
STARTCODE
,
ENDCODE
,
STARTSTACK
,
KSTKESP
,
KSTKEIP
,
SIGNAL
,
BLOCKED
,
SSIGIGNORE
,
SIGCATCH
,
WCHAN
,
NSWAP
,
CNSWAP
,
EXIT_SIGNAL
,
PROCESSOR
,
M_SIZE
,
M_RESIDENT
,
M_SHARE
,
M_TRS
,
M_DRS
,
M_LRS
,
M_DT
,
ST_UID
,
PERCENT_CPU
,
PERCENT_MEM
,
USER
,
TIME
,
NLWP
,
TGID
,
CMINFLT
=
11
,
CMAJFLT
=
13
,
UTIME
=
14
,
STIME
=
15
,
CUTIME
=
16
,
CSTIME
=
17
,
PROCESSOR
=
38
,
M_SHARE
=
41
,
M_TRS
=
42
,
M_DRS
=
43
,
M_LRS
=
44
,
M_DT
=
45
,
#ifdef HAVE_OPENVZ
CTID
,
VPID
,
CTID
=
100
,
VPID
=
101
,
#endif
#ifdef HAVE_VSERVER
VXID
,
VXID
=
102
,
#endif
#ifdef HAVE_TASKSTATS
RCHAR
,
WCHAR
,
SYSCR
,
SYSCW
,
RBYTES
,
WBYTES
,
CNCLWB
,
IO_READ_RATE
,
IO_WRITE_RATE
,
IO_RATE
,
RCHAR
=
103
,
WCHAR
=
104
,
SYSCR
=
105
,
SYSCW
=
106
,
RBYTES
=
107
,
WBYTES
=
108
,
CNCLWB
=
109
,
IO_READ_RATE
=
110
,
IO_WRITE_RATE
=
111
,
IO_RATE
=
112
,
#endif
#ifdef HAVE_CGROUP
CGROUP
,
CGROUP
=
113
,
#endif
#ifdef HAVE_OOM
OOM
,
OOM
=
114
,
#endif
IO_PRIORITY
,
IO_PRIORITY
=
115
,
LAST_PROCESSFIELD
}
LinuxProcessField
;
...
...
@@ -45,9 +83,53 @@ typedef enum LinuxProcessFields {
typedef
struct
LinuxProcess_
{
Process
super
;
IOPriority
ioPriority
;
unsigned
long
int
cminflt
;
unsigned
long
int
cmajflt
;
unsigned
long
long
int
utime
;
unsigned
long
long
int
stime
;
unsigned
long
long
int
cutime
;
unsigned
long
long
int
cstime
;
int
processor
;
long
m_share
;
long
m_trs
;
long
m_drs
;
long
m_lrs
;
long
m_dt
;
#ifdef HAVE_TASKSTATS
unsigned
long
long
io_rchar
;
unsigned
long
long
io_wchar
;
unsigned
long
long
io_syscr
;
unsigned
long
long
io_syscw
;
unsigned
long
long
io_read_bytes
;
unsigned
long
long
io_write_bytes
;
unsigned
long
long
io_cancelled_write_bytes
;
unsigned
long
long
io_rate_read_time
;
unsigned
long
long
io_rate_write_time
;
double
io_rate_read_bps
;
double
io_rate_write_bps
;
#endif
#ifdef HAVE_OPENVZ
unsigned
int
ctid
;
unsigned
int
vpid
;
#endif
#ifdef HAVE_VSERVER
unsigned
int
vxid
;
#endif
#ifdef HAVE_CGROUP
char
*
cgroup
;
#endif
#ifdef HAVE_OOM
unsigned
int
oom
;
#endif
}
LinuxProcess
;
#define Process_delete LinuxProcess_delete
#ifndef Process_isKernelThread
#define Process_isKernelThread(_process) (_process->pgrp == 0)
#endif
#ifndef Process_isUserlandThread
#define Process_isUserlandThread(_process) (_process->pid != _process->tgid)
#endif
extern
ProcessFieldData
Process_fields
[];
...
...
@@ -59,7 +141,7 @@ void Process_setupColumnWidths();
LinuxProcess
*
LinuxProcess_new
(
Settings
*
settings
);
void
Linux
Process_delete
(
Object
*
cast
);
void
Process_delete
(
Object
*
cast
);
/*
[1] Note that before kernel 2.6.26 a process that has not asked for
...
...
@@ -79,4 +161,7 @@ void Process_writeField(Process* this, RichString* str, ProcessField field);
long
Process_compare
(
const
void
*
v1
,
const
void
*
v2
);
bool
Process_isThread
(
Process
*
this
);
#endif
This diff is collapsed.
Click to expand it.
linux/LinuxProcessList.c
View file @
be1700cf
...
...
@@ -152,6 +152,7 @@ static ssize_t xread(int fd, void *buf, size_t count) {
}
static
bool
LinuxProcessList_readStatFile
(
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
,
char
*
command
)
{
LinuxProcess
*
lp
=
(
LinuxProcess
*
)
process
;
char
filename
[
MAX_NAME
+
1
];
snprintf
(
filename
,
MAX_NAME
,
"%s/%s/stat"
,
dirname
,
name
);
int
fd
=
open
(
filename
,
O_RDONLY
);
...
...
@@ -194,19 +195,19 @@ static bool LinuxProcessList_readStatFile(Process *process, const char* dirname,
location
+=
1
;
process
->
minflt
=
strtoull
(
location
,
&
location
,
10
);
location
+=
1
;
p
rocess
->
cminflt
=
strtoull
(
location
,
&
location
,
10
);
l
p
->
cminflt
=
strtoull
(
location
,
&
location
,
10
);
location
+=
1
;
process
->
majflt
=
strtoull
(
location
,
&
location
,
10
);
location
+=
1
;
p
rocess
->
cmajflt
=
strtoull
(
location
,
&
location
,
10
);
l
p
->
cmajflt
=
strtoull
(
location
,
&
location
,
10
);
location
+=
1
;
p
rocess
->
utime
=
strtoull
(
location
,
&
location
,
10
);
l
p
->
utime
=
strtoull
(
location
,
&
location
,
10
);
location
+=
1
;
p
rocess
->
stime
=
strtoull
(
location
,
&
location
,
10
);
l
p
->
stime
=
strtoull
(
location
,
&
location
,
10
);
location
+=
1
;
p
rocess
->
cutime
=
strtoull
(
location
,
&
location
,
10
);
l
p
->
cutime
=
strtoull
(
location
,
&
location
,
10
);
location
+=
1
;
p
rocess
->
cstime
=
strtoull
(
location
,
&
location
,
10
);
l
p
->
cstime
=
strtoull
(
location
,
&
location
,
10
);
location
+=
1
;
process
->
priority
=
strtol
(
location
,
&
location
,
10
);
location
+=
1
;
...
...
@@ -218,7 +219,9 @@ static bool LinuxProcessList_readStatFile(Process *process, const char* dirname,
process
->
exit_signal
=
strtol
(
location
,
&
location
,
10
);
location
+=
1
;
assert
(
location
!=
NULL
);
process
->
processor
=
strtol
(
location
,
&
location
,
10
);
lp
->
processor
=
strtol
(
location
,
&
location
,
10
);
process
->
time
=
lp
->
utime
+
lp
->
stime
;
return
true
;
}
...
...
@@ -246,7 +249,7 @@ static bool LinuxProcessList_statProcessDir(Process* process, const char* dirnam
#ifdef HAVE_TASKSTATS
static
void
LinuxProcessList_readIoFile
(
Process
*
process
,
const
char
*
dirname
,
char
*
name
,
unsigned
long
long
now
)
{
static
void
LinuxProcessList_readIoFile
(
Linux
Process
*
process
,
const
char
*
dirname
,
char
*
name
,
unsigned
long
long
now
)
{
char
filename
[
MAX_NAME
+
1
];
filename
[
MAX_NAME
]
=
'\0'
;
...
...
@@ -307,7 +310,7 @@ static void LinuxProcessList_readIoFile(Process* process, const char* dirname, c
static
bool
LinuxProcessList_readStatmFile
(
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
)
{
static
bool
LinuxProcessList_readStatmFile
(
Linux
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
)
{
char
filename
[
MAX_NAME
+
1
];
snprintf
(
filename
,
MAX_NAME
,
"%s/%s/statm"
,
dirname
,
name
);
int
fd
=
open
(
filename
,
O_RDONLY
);
...
...
@@ -320,8 +323,8 @@ static bool LinuxProcessList_readStatmFile(Process* process, const char* dirname
char
*
p
=
buf
;
errno
=
0
;
process
->
m_size
=
strtol
(
p
,
&
p
,
10
);
if
(
*
p
==
' '
)
p
++
;
process
->
m_resident
=
strtol
(
p
,
&
p
,
10
);
if
(
*
p
==
' '
)
p
++
;
process
->
super
.
m_size
=
strtol
(
p
,
&
p
,
10
);
if
(
*
p
==
' '
)
p
++
;
process
->
super
.
m_resident
=
strtol
(
p
,
&
p
,
10
);
if
(
*
p
==
' '
)
p
++
;
process
->
m_share
=
strtol
(
p
,
&
p
,
10
);
if
(
*
p
==
' '
)
p
++
;
process
->
m_trs
=
strtol
(
p
,
&
p
,
10
);
if
(
*
p
==
' '
)
p
++
;
process
->
m_lrs
=
strtol
(
p
,
&
p
,
10
);
if
(
*
p
==
' '
)
p
++
;
...
...
@@ -360,7 +363,7 @@ static void LinuxProcessList_readOpenVZData(ProcessList* this, Process* process,
#ifdef HAVE_CGROUP
static
void
LinuxProcessList_readCGroupFile
(
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
)
{
static
void
LinuxProcessList_readCGroupFile
(
Linux
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
)
{
char
filename
[
MAX_NAME
+
1
];
snprintf
(
filename
,
MAX_NAME
,
"%s/%s/cgroup"
,
dirname
,
name
);
FILE
*
file
=
fopen
(
filename
,
"r"
);
...
...
@@ -390,7 +393,7 @@ static void LinuxProcessList_readCGroupFile(Process* process, const char* dirnam
#ifdef HAVE_VSERVER
static
void
LinuxProcessList_readVServerData
(
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
)
{
static
void
LinuxProcessList_readVServerData
(
Linux
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
)
{
char
filename
[
MAX_NAME
+
1
];
snprintf
(
filename
,
MAX_NAME
,
"%s/%s/status"
,
dirname
,
name
);
FILE
*
file
=
fopen
(
filename
,
"r"
);
...
...
@@ -423,7 +426,7 @@ static void LinuxProcessList_readVServerData(Process* process, const char* dirna
#ifdef HAVE_OOM
static
void
LinuxProcessList_readOomData
(
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
)
{
static
void
LinuxProcessList_readOomData
(
Linux
Process
*
process
,
const
char
*
dirname
,
const
char
*
name
)
{
char
filename
[
MAX_NAME
+
1
];
snprintf
(
filename
,
MAX_NAME
,
"%s/%s/oom_score"
,
dirname
,
name
);
FILE
*
file
=
fopen
(
filename
,
"r"
);
...
...
@@ -514,95 +517,97 @@ static bool LinuxProcessList_processEntries(LinuxProcessList* this, const char*
if
(
pid
<=
0
)
continue
;
Process
*
proc
ess
=
NULL
;
Process
*
existingProc
ess
=
(
Process
*
)
Hashtable_get
(
this
->
super
.
processTable
,
pid
);
Process
*
proc
=
NULL
;
Process
*
existingProc
=
(
Process
*
)
Hashtable_get
(
this
->
super
.
processTable
,
pid
);
if
(
existingProc
ess
)
{
assert
(
Vector_indexOf
(
this
->
processes
,
existingProc
ess
,
Process_pidCompare
)
!=
-
1
);
proc
ess
=
existingProc
ess
;
assert
(
proc
ess
->
pid
==
pid
);
if
(
existingProc
)
{
assert
(
Vector_indexOf
(
this
->
processes
,
existingProc
,
Process_pidCompare
)
!=
-
1
);
proc
=
existingProc
;
assert
(
proc
->
pid
==
pid
);
}
else
{
proc
ess
=
(
Process
*
)
LinuxProcess_new
(
settings
);
assert
(
proc
ess
->
comm
==
NULL
);
proc
ess
->
pid
=
pid
;
proc
ess
->
tgid
=
parent
?
parent
->
pid
:
pid
;
proc
=
(
Process
*
)
LinuxProcess_new
(
settings
);
assert
(
proc
->
comm
==
NULL
);
proc
->
pid
=
pid
;
proc
->
tgid
=
parent
?
parent
->
pid
:
pid
;
}
LinuxProcess
*
lp
=
(
LinuxProcess
*
)
proc
;
char
subdirname
[
MAX_NAME
+
1
];
snprintf
(
subdirname
,
MAX_NAME
,
"%s/%s/task"
,
dirname
,
name
);
LinuxProcessList_processEntries
(
this
,
subdirname
,
proc
ess
,
period
,
tv
);
LinuxProcessList_processEntries
(
this
,
subdirname
,
proc
,
period
,
tv
);
#ifdef HAVE_TASKSTATS
if
(
settings
->
flags
&
PROCESS_FLAG_IO
)
LinuxProcessList_readIoFile
(
p
rocess
,
dirname
,
name
,
now
);
LinuxProcessList_readIoFile
(
l
p
,
dirname
,
name
,
now
);
#endif
if
(
!
LinuxProcessList_readStatmFile
(
p
rocess
,
dirname
,
name
))
if
(
!
LinuxProcessList_readStatmFile
(
l
p
,
dirname
,
name
))
goto
errorReadingProcess
;
proc
ess
->
show
=
!
((
hideKernelThreads
&&
Process_isKernelThread
(
proc
ess
))
||
(
hideUserlandThreads
&&
Process_isUserlandThread
(
proc
ess
)));
proc
->
show
=
!
((
hideKernelThreads
&&
Process_isKernelThread
(
proc
))
||
(
hideUserlandThreads
&&
Process_isUserlandThread
(
proc
)));
char
command
[
MAX_NAME
+
1
];
unsigned
long
long
int
lasttimes
=
(
p
rocess
->
utime
+
p
rocess
->
stime
);
if
(
!
LinuxProcessList_readStatFile
(
proc
ess
,
dirname
,
name
,
command
))
unsigned
long
long
int
lasttimes
=
(
l
p
->
utime
+
l
p
->
stime
);
if
(
!
LinuxProcessList_readStatFile
(
proc
,
dirname
,
name
,
command
))
goto
errorReadingProcess
;
if
(
settings
->
flags
&
PROCESS_FLAG_LINUX_IOPRIO
)
LinuxProcess_updateIOPriority
(
(
LinuxProcess
*
)
process
);
float
percent_cpu
=
(
p
rocess
->
utime
+
p
rocess
->
stime
-
lasttimes
)
/
period
*
100
.
0
;
proc
ess
->
percent_cpu
=
MAX
(
MIN
(
percent_cpu
,
cpus
*
100
.
0
),
0
.
0
);
if
(
isnan
(
proc
ess
->
percent_cpu
))
proc
ess
->
percent_cpu
=
0
.
0
;
proc
ess
->
percent_mem
=
(
proc
ess
->
m_resident
*
PAGE_SIZE_KB
)
/
(
double
)(
this
->
totalMem
)
*
100
.
0
;
LinuxProcess_updateIOPriority
(
lp
);
float
percent_cpu
=
(
l
p
->
utime
+
l
p
->
stime
-
lasttimes
)
/
period
*
100
.
0
;
proc
->
percent_cpu
=
MAX
(
MIN
(
percent_cpu
,
cpus
*
100
.
0
),
0
.
0
);
if
(
isnan
(
proc
->
percent_cpu
))
proc
->
percent_cpu
=
0
.
0
;
proc
->
percent_mem
=
(
proc
->
m_resident
*
PAGE_SIZE_KB
)
/
(
double
)(
this
->
totalMem
)
*
100
.
0
;
if
(
!
existingProc
ess
)
{
if
(
!
existingProc
)
{
if
(
!
LinuxProcessList_statProcessDir
(
proc
ess
,
dirname
,
name
,
curTime
))
if
(
!
LinuxProcessList_statProcessDir
(
proc
,
dirname
,
name
,
curTime
))
goto
errorReadingProcess
;
proc
ess
->
user
=
UsersTable_getRef
(
this
->
super
.
usersTable
,
proc
ess
->
st_uid
);
proc
->
user
=
UsersTable_getRef
(
this
->
super
.
usersTable
,
proc
->
st_uid
);
#ifdef HAVE_OPENVZ
LinuxProcessList_readOpenVZData
(
this
,
p
rocess
,
dirname
,
name
);
LinuxProcessList_readOpenVZData
(
this
,
l
p
,
dirname
,
name
);
#endif
#ifdef HAVE_VSERVER
if
(
settings
->
flags
&
PROCESS_FLAG_LINUX_VSERVER
)
LinuxProcessList_readVServerData
(
p
rocess
,
dirname
,
name
);
LinuxProcessList_readVServerData
(
l
p
,
dirname
,
name
);
#endif
if
(
!
LinuxProcessList_readCmdlineFile
(
proc
ess
,
dirname
,
name
))
if
(
!
LinuxProcessList_readCmdlineFile
(
proc
,
dirname
,
name
))
goto
errorReadingProcess
;
ProcessList_add
((
ProcessList
*
)
this
,
proc
ess
);
ProcessList_add
((
ProcessList
*
)
this
,
proc
);
}
else
{
if
(
settings
->
updateProcessNames
)
{
if
(
!
LinuxProcessList_readCmdlineFile
(
proc
ess
,
dirname
,
name
))
if
(
!
LinuxProcessList_readCmdlineFile
(
proc
,
dirname
,
name
))
goto
errorReadingProcess
;
}
}
#ifdef HAVE_CGROUP
if
(
settings
->
flags
&
PROCESS_FLAG_LINUX_CGROUP
)
LinuxProcessList_readCGroupFile
(
p
rocess
,
dirname
,
name
);
LinuxProcessList_readCGroupFile
(
l
p
,
dirname
,
name
);
#endif
#ifdef HAVE_OOM
LinuxProcessList_readOomData
(
p
rocess
,
dirname
,
name
);
LinuxProcessList_readOomData
(
l
p
,
dirname
,
name
);
#endif
if
(
proc
ess
->
state
==
'Z'
)
{
free
(
proc
ess
->
comm
);
proc
ess
->
basenameOffset
=
-
1
;
proc
ess
->
comm
=
strdup
(
command
);
}
else
if
(
Process_isThread
(
proc
ess
))
{
if
(
settings
->
showThreadNames
||
Process_isKernelThread
(
proc
ess
)
||
proc
ess
->
state
==
'Z'
)
{
free
(
proc
ess
->
comm
);
proc
ess
->
basenameOffset
=
-
1
;
proc
ess
->
comm
=
strdup
(
command
);
if
(
proc
->
state
==
'Z'
)
{
free
(
proc
->
comm
);
proc
->
basenameOffset
=
-
1
;
proc
->
comm
=
strdup
(
command
);
}
else
if
(
Process_isThread
(
proc
))
{
if
(
settings
->
showThreadNames
||
Process_isKernelThread
(
proc
)
||
proc
->
state
==
'Z'
)
{
free
(
proc
->
comm
);
proc
->
basenameOffset
=
-
1
;
proc
->
comm
=
strdup
(
command
);
}
else
if
(
settings
->
showThreadNames
)
{
if
(
!
LinuxProcessList_readCmdlineFile
(
proc
ess
,
dirname
,
name
))
if
(
!
LinuxProcessList_readCmdlineFile
(
proc
,
dirname
,
name
))
goto
errorReadingProcess
;
}
if
(
Process_isKernelThread
(
proc
ess
))
{
if
(
Process_isKernelThread
(
proc
))
{
this
->
kernelThreads
++
;
}
else
{
this
->
userlandThreads
++
;
...
...
@@ -610,23 +615,23 @@ static bool LinuxProcessList_processEntries(LinuxProcessList* this, const char*
}
this
->
totalTasks
++
;
if
(
proc
ess
->
state
==
'R'
)
if
(
proc
->
state
==
'R'
)
this
->
runningTasks
++
;
proc
ess
->
updated
=
true
;
proc
->
updated
=
true
;
continue
;
// Exception handler.
errorReadingProcess:
{
if
(
proc
ess
->
comm
)
{
free
(
proc
ess
->
comm
);
proc
ess
->
basenameOffset
=
-
1
;
proc
ess
->
comm
=
NULL
;
if
(
proc
->
comm
)
{
free
(
proc
->
comm
);
proc
->
basenameOffset
=
-
1
;
proc
->
comm
=
NULL
;
}
if
(
existingProc
ess
)
ProcessList_remove
((
ProcessList
*
)
this
,
proc
ess
);
if
(
existingProc
)
ProcessList_remove
((
ProcessList
*
)
this
,
proc
);
else
Linux
Process_delete
((
Object
*
)
proc
ess
);
Process_delete
((
Object
*
)
proc
);
}
}
closedir
(
dir
);
...
...
This diff is collapsed.
Click to expand it.
linux/Platform.c
View file @
be1700cf
...
...
@@ -21,6 +21,7 @@ in the source distribution for its full text.
#include "UptimeMeter.h"
#include "ClockMeter.h"
#include "HostnameMeter.h"
#include "LinuxProcess.h"
#include <math.h>
#include <assert.h>
...
...
@@ -29,10 +30,12 @@ in the source distribution for its full text.
#include "Action.h"
#include "MainPanel.h"
#include "BatteryMeter.h"
#include "LinuxProcess.h"
}*/
ProcessField
Platform_defaultFields
[]
=
{
PID
,
USER
,
PRIORITY
,
NICE
,
M_SIZE
,
M_RESIDENT
,
M_SHARE
,
STATE
,
PERCENT_CPU
,
PERCENT_MEM
,
TIME
,
COMM
,
0
};
//static ProcessField defaultIoFields[] = { PID, IO_PRIORITY, USER, IO_READ_RATE, IO_WRITE_RATE, IO_RATE, COMM, 0 };
int
Platform_numberOfFields
=
LAST_PROCESSFIELD
;
static
Htop_Reaction
Platform_actionSetIOPriority
(
State
*
st
)
{
...
...
This diff is collapsed.
Click to expand it.
linux/Platform.h
View file @
be1700cf
...
...
@@ -12,8 +12,8 @@ in the source distribution for its full text.
#include "Action.h"
#include "MainPanel.h"
#include "BatteryMeter.h"
#include "LinuxProcess.h"
extern
ProcessField
Platform_defaultFields
[];
extern
int
Platform_numberOfFields
;
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help