Skip to content
GitLab
Menu
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
b10e54cd
Commit
b10e54cd
authored
Jan 06, 2016
by
Michael Klein
Browse files
Merge remote-tracking branch 'upstream/master' into envscreen
parents
cc23d13f
fc4c9757
Changes
19
Hide whitespace changes
Inline
Side-by-side
IncSet.c
View file @
b10e54cd
...
...
@@ -169,6 +169,8 @@ bool IncSet_handleKey(IncSet* this, int ch, Panel* panel, IncMode_GetPanelValue
IncMode_reset
(
mode
);
}
}
}
else
if
(
ch
==
KEY_RESIZE
)
{
Panel_resize
(
panel
,
COLS
,
LINES
-
panel
->
y
-
1
);
}
else
{
if
(
mode
->
isFilter
)
{
filterChanged
=
true
;
...
...
MainPanel.c
View file @
b10e54cd
...
...
@@ -91,7 +91,7 @@ static HandlerResult MainPanel_eventHandler(Panel* super, int ch) {
result
=
HANDLED
;
}
else
if
(
ch
==
27
)
{
return
HANDLED
;
}
else
if
(
ch
!=
ERR
&&
this
->
keys
[
ch
])
{
}
else
if
(
ch
!=
ERR
&&
ch
>
0
&&
ch
<
KEY_MAX
&&
this
->
keys
[
ch
])
{
reaction
|=
(
this
->
keys
[
ch
])(
this
->
state
);
result
=
HANDLED
;
}
else
if
(
isdigit
(
ch
))
{
...
...
MetersPanel.c
View file @
b10e54cd
...
...
@@ -36,7 +36,7 @@ static const char* MetersKeys[] = {"Space", "Enter", "Del", "Esc"};
static
int
MetersEvents
[]
=
{
' '
,
13
,
KEY_DC
,
27
};
static
const
char
*
MetersMovingFunctions
[]
=
{
"Up "
,
"Down "
,
"Left "
,
"Right "
,
"Confirm"
,
"Delete"
,
"Done "
,
NULL
};
static
const
char
*
MetersMovingKeys
[]
=
{
"Up"
,
"Dn"
,
"Lt"
,
"Rt"
,
"Arrows"
,
"Enter"
,
"Del"
,
"Esc"
};
static
const
char
*
MetersMovingKeys
[]
=
{
"Up"
,
"Dn"
,
"Lt"
,
"Rt"
,
"Enter"
,
"Del"
,
"Esc"
};
static
int
MetersMovingEvents
[]
=
{
KEY_UP
,
KEY_DOWN
,
KEY_LEFT
,
KEY_RIGHT
,
13
,
KEY_DC
,
27
};
static
FunctionBar
*
Meters_movingBar
=
NULL
;
...
...
Process.c
View file @
b10e54cd
...
...
@@ -513,8 +513,11 @@ void Process_toggleTag(Process* this) {
}
bool
Process_setPriority
(
Process
*
this
,
int
priority
)
{
uid_t
euid
=
geteuid
();
seteuid
(
getuid
());
int
old_prio
=
getpriority
(
PRIO_PROCESS
,
this
->
pid
);
int
err
=
setpriority
(
PRIO_PROCESS
,
this
->
pid
,
priority
);
seteuid
(
euid
);
if
(
err
==
0
&&
old_prio
!=
getpriority
(
PRIO_PROCESS
,
this
->
pid
))
{
this
->
nice
=
priority
;
}
...
...
@@ -526,7 +529,10 @@ bool Process_changePriorityBy(Process* this, size_t delta) {
}
void
Process_sendSignal
(
Process
*
this
,
size_t
sgn
)
{
uid_t
euid
=
geteuid
();
seteuid
(
getuid
());
kill
(
this
->
pid
,
(
int
)
sgn
);
seteuid
(
euid
);
}
long
Process_pidCompare
(
const
void
*
v1
,
const
void
*
v2
)
{
...
...
Settings.c
View file @
b10e54cd
...
...
@@ -154,7 +154,12 @@ static void readFields(ProcessField* fields, int* flags, const char* line) {
}
static
bool
Settings_read
(
Settings
*
this
,
const
char
*
fileName
)
{
FILE
*
fd
=
fopen
(
fileName
,
"r"
);
FILE
*
fd
;
uid_t
euid
=
geteuid
();
seteuid
(
getuid
());
fd
=
fopen
(
fileName
,
"r"
);
seteuid
(
euid
);
if
(
!
fd
)
return
false
;
...
...
@@ -260,7 +265,11 @@ static void writeMeterModes(Settings* this, FILE* fd, int column) {
bool
Settings_write
(
Settings
*
this
)
{
FILE
*
fd
;
uid_t
euid
=
geteuid
();
seteuid
(
getuid
());
fd
=
fopen
(
this
->
filename
,
"w"
);
seteuid
(
euid
);
if
(
fd
==
NULL
)
{
return
false
;
}
...
...
@@ -345,6 +354,8 @@ Settings* Settings_new(int cpuCount) {
htopDir
=
String_cat
(
home
,
"/.config/htop"
);
}
legacyDotfile
=
String_cat
(
home
,
"/.htoprc"
);
uid_t
euid
=
geteuid
();
seteuid
(
getuid
());
(
void
)
mkdir
(
configDir
,
0700
);
(
void
)
mkdir
(
htopDir
,
0700
);
free
(
htopDir
);
...
...
@@ -357,6 +368,7 @@ Settings* Settings_new(int cpuCount) {
free
(
legacyDotfile
);
legacyDotfile
=
NULL
;
}
seteuid
(
euid
);
}
this
->
colorScheme
=
0
;
this
->
changed
=
false
;
...
...
TraceScreen.c
View file @
b10e54cd
...
...
@@ -86,6 +86,7 @@ void TraceScreen_run(TraceScreen* this) {
int
child
=
fork
();
if
(
child
==
-
1
)
return
;
if
(
child
==
0
)
{
seteuid
(
getuid
());
dup2
(
fdpair
[
1
],
STDERR_FILENO
);
int
ok
=
fcntl
(
fdpair
[
1
],
F_SETFL
,
O_NONBLOCK
);
if
(
ok
!=
-
1
)
{
...
...
configure.ac
View file @
b10e54cd
...
...
@@ -103,7 +103,7 @@ if test "x$enable_proc" = xyes; then
AC_DEFINE(HAVE_PROC, 1, [Define if using a Linux-compatible proc filesystem.])
fi
AC_ARG_WITH(proc, [
--with-proc=DIR
Location of a Linux-compatible proc filesystem (default=/proc).],
AC_ARG_WITH(proc, [
AC_HELP_STRING([
--with-proc=DIR
], [
Location of a Linux-compatible proc filesystem (default=/proc).]
)]
,
if test -n "$withval"; then
AC_DEFINE_UNQUOTED(PROCDIR, "$withval", [Path of proc filesystem])
...
...
@@ -144,40 +144,59 @@ if test "x$enable_taskstats" = xyes; then
AC_DEFINE(HAVE_TASKSTATS, 1, [Define if taskstats support enabled.])
fi
# HTOP_CHECK_NCURSES_LIBRARY(LIBNAME, FUNCTION, DEFINE, CONFIG_SCRIPT, ELSE_PART)
m4_define([HTOP_CHECK_NCURSES_LIBRARY],
# HTOP_CHECK_SCRIPT(LIBNAME, FUNCTION, DEFINE, CONFIG_SCRIPT, ELSE_PART)
m4_define([HTOP_CHECK_SCRIPT],
[
htop_config_script=$([$4] --libs 2> /dev/null)
htop_script_success=no
htop_save_LDFLAGS="$LDFLAGS"
if test ! "x$htop_config_script" = x; then
LDFLAGS="$htop_config_script $LDFLAGS"
AC_CHECK_LIB([$1], [$2], [
AC_DEFINE([$3], 1, [The library is present.])
LIBS="$htop_config_script $LIBS "
htop_script_success=yes
], [])
LDFLAGS="$save_LDFLAGS"
fi
if test "x$htop_script_success" = xno; then
[$5]
fi
])
# HTOP_CHECK_LIB(LIBNAME, FUNCTION, DEFINE, ELSE_PART)
m4_define([HTOP_CHECK_LIB],
[
AC_CHECK_LIB([$1], [$2], [
AC_DEFINE([$3], 1, [The library is present.])
config_script=$([$4] --libs 2> /dev/null)
if test ! "x$config_script" = x; then
LIBS="$config_script $LIBS "
else
LIBS="-l[$1] $LIBS "
fi
], [$5])
LIBS="-l[$1] $LIBS "
], [$4])
])
AC_ARG_ENABLE(unicode, [AC_HELP_STRING([--enable-unicode], [enable Unicode support])], ,enable_unicode="yes")
if test "x$enable_unicode" = xyes; then
HTOP_CHECK_NCURSES_LIBRARY([ncursesw6], [addnwstr], [HAVE_LIBNCURSESW], "ncursesw6-config", [
HTOP_CHECK_NCURSES_LIBRARY([ncursesw], [addnwstr], [HAVE_LIBNCURSESW], "ncursesw5-config", [
HTOP_CHECK_NCURSES_LIBRARY([ncurses], [addnwstr], [HAVE_LIBNCURSES], "ncurses5-config", [
missing_libraries="$missing_libraries libncursesw"
AC_MSG_ERROR([You may want to use --disable-unicode or install libncursesw.])
])
])
])
HTOP_CHECK_SCRIPT([ncursesw6], [addnwstr], [HAVE_LIBNCURSESW], "ncursesw6-config",
HTOP_CHECK_SCRIPT([ncursesw], [addnwstr], [HAVE_LIBNCURSESW], "ncursesw5-config",
HTOP_CHECK_SCRIPT([ncurses], [addnwstr], [HAVE_LIBNCURSESW], "ncurses5-config",
HTOP_CHECK_LIB([ncursesw6], [addnwstr], [HAVE_LIBNCURSESW],
HTOP_CHECK_LIB([ncursesw], [addnwstr], [HAVE_LIBNCURSESW],
HTOP_CHECK_LIB([ncurses], [addnwstr], [HAVE_LIBNCURSESW],
missing_libraries="$missing_libraries libncursesw"
AC_MSG_ERROR([You may want to use --disable-unicode or install libncursesw.])
))))))
AC_CHECK_HEADERS([ncursesw/curses.h],[:],
[AC_CHECK_HEADERS([ncurses/ncurses.h],[:],
[AC_CHECK_HEADERS([ncurses/curses.h],[:],
[AC_CHECK_HEADERS([ncurses.h],[:],[missing_headers="$missing_headers $ac_header"])])])])
else
HTOP_CHECK_NCURSES_LIBRARY([ncurses6], [refresh], [HAVE_LIBNCURSES], "ncurses6-config", [
HTOP_CHECK_NCURSES_LIBRARY([ncurses], [refresh], [HAVE_LIBNCURSES], "ncurses5-config", [
missing_libraries="$missing_libraries libncurses"
])
])
HTOP_CHECK_SCRIPT([ncurses6], [refresh], [HAVE_LIBNCURSES], "ncurses6-config",
HTOP_CHECK_SCRIPT([ncurses], [refresh], [HAVE_LIBNCURSES], "ncurses5-config",
HTOP_CHECK_LIB([ncurses6], [refresh], [HAVE_LIBNCURSES],
HTOP_CHECK_LIB([ncurses], [refresh], [HAVE_LIBNCURSES],
missing_libraries="$missing_libraries libncurses"
))))
AC_CHECK_HEADERS([curses.h],[:],
[AC_CHECK_HEADERS([ncurses/curses.h],[:],
[AC_CHECK_HEADERS([ncurses/ncurses.h],[:],
...
...
darwin/DarwinCRT.c
View file @
b10e54cd
...
...
@@ -28,7 +28,7 @@ void CRT_handleSIGSEGV(int sgn) {
#endif
#else
fprintf
(
stderr
,
"
\n
Unfortunately, you seem to be using an unsupported platform!"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package mantainer!
\n\n
"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package ma
i
ntainer!
\n\n
"
);
#endif
abort
();
}
...
...
freebsd/FreeBSDCRT.c
View file @
b10e54cd
...
...
@@ -15,7 +15,7 @@ void CRT_handleSIGSEGV(int sgn) {
CRT_done
();
fprintf
(
stderr
,
"
\n\n
htop "
VERSION
" aborting.
\n
"
);
fprintf
(
stderr
,
"
\n
Unfortunately, you seem to be using an unsupported platform!"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package mantainer!
\n\n
"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package ma
i
ntainer!
\n\n
"
);
abort
();
}
freebsd/FreeBSDProcessList.c
View file @
b10e54cd
...
...
@@ -23,53 +23,160 @@ in the source distribution for its full text.
#include <sys/param.h>
#include <sys/jail.h>
#include <sys/uio.h>
#include <sys/resource.h>
#define JAIL_ERRMSGLEN 1024
char jail_errmsg[JAIL_ERRMSGLEN];
typedef struct CPUData_ {
unsigned long long int totalTime;
unsigned long long int totalPeriod;
double userPercent;
double nicePercent;
double systemPercent;
double irqPercent;
double idlePercent;
double systemAllPercent;
} CPUData;
typedef struct FreeBSDProcessList_ {
ProcessList super;
kvm_t* kd;
int zfsArcEnabled;
unsigned long long int memWire;
unsigned long long int memActive;
unsigned long long int memInactive;
unsigned long long int memFree;
unsigned long long int memZfsArc;
CPUData* cpus;
unsigned long *cp_time_o;
unsigned long *cp_time_n;
unsigned long *cp_times_o;
unsigned long *cp_times_n;
} FreeBSDProcessList;
}*/
static
int
MIB_hw_physmem
[
2
];
static
int
MIB_vm_stats_vm_v_page_count
[
4
];
static
int
pageSize
;
static
int
pageSizeKb
;
static
int
MIB_vm_stats_vm_v_wire_count
[
4
];
static
int
MIB_vm_stats_vm_v_active_count
[
4
];
static
int
MIB_vm_stats_vm_v_cache_count
[
4
];
static
int
MIB_hw_physmem
[
2
];
static
int
MIB_vm_stats_vm_v_inactive_count
[
4
];
static
int
MIB_vm_stats_vm_v_free_count
[
4
];
static
int
MIB_vfs_bufspace
[
2
];
static
int
MIB_kstat_zfs_misc_arcstats_size
[
5
];
static
int
MIB_kern_cp_time
[
2
];
static
int
MIB_kern_cp_times
[
2
];
static
int
kernelFScale
;
static
int
pageSizeKb
;
ProcessList
*
ProcessList_new
(
UsersTable
*
usersTable
,
Hashtable
*
pidWhiteList
,
uid_t
userId
)
{
FreeBSDProcessList
*
fpl
=
calloc
(
1
,
sizeof
(
FreeBSDProcessList
));
ProcessList
*
pl
=
(
ProcessList
*
)
fpl
;
ProcessList_init
(
pl
,
Class
(
FreeBSDProcess
),
usersTable
,
pidWhiteList
,
userId
);
size_t
len
;
// physical memory in system: hw.physmem
// physical page size: hw.pagesize
// usable pagesize : vm.stats.vm.v_page_size
len
=
2
;
sysctlnametomib
(
"hw.physmem"
,
MIB_hw_physmem
,
&
len
);
len
=
sizeof
(
pageSize
);
if
(
sysctlbyname
(
"vm.stats.vm.v_page_size"
,
&
pageSize
,
&
len
,
NULL
,
0
)
==
-
1
)
{
pageSize
=
PAGE_SIZE
;
pageSizeKb
=
PAGE_SIZE_KB
;
}
else
{
pageSizeKb
=
pageSize
/
ONE_K
;
}
// usable page count vm.stats.vm.v_page_count
// actually usable memory : vm.stats.vm.v_page_count * vm.stats.vm.v_page_size
len
=
4
;
sysctlnametomib
(
"vm.stats.vm.v_page_count"
,
MIB_vm_stats_vm_v_page_count
,
&
len
);
len
=
4
;
sysctlnametomib
(
"vm.stats.vm.v_wire_count"
,
MIB_vm_stats_vm_v_wire_count
,
&
len
);
len
=
4
;
sysctlnametomib
(
"vm.stats.vm.v_active_count"
,
MIB_vm_stats_vm_v_active_count
,
&
len
);
len
=
4
;
sysctlnametomib
(
"vm.stats.vm.v_cache_count"
,
MIB_vm_stats_vm_v_cache_count
,
&
len
);
len
=
4
;
sysctlnametomib
(
"vm.stats.vm.v_inactive_count"
,
MIB_vm_stats_vm_v_inactive_count
,
&
len
);
len
=
4
;
sysctlnametomib
(
"vm.stats.vm.v_free_count"
,
MIB_vm_stats_vm_v_free_count
,
&
len
);
len
=
2
;
sysctlnametomib
(
"vfs.bufspace"
,
MIB_vfs_bufspace
,
&
len
);
len
=
sizeof
(
fpl
->
memZfsArc
);
if
(
sysctlbyname
(
"kstat.zfs.misc.arcstats.size"
,
&
fpl
->
memZfsArc
,
&
len
,
NULL
,
0
)
==
0
&&
fpl
->
memZfsArc
!=
0
)
{
sysctlnametomib
(
"kstat.zfs.misc.arcstats.size"
,
MIB_kstat_zfs_misc_arcstats_size
,
&
len
);
fpl
->
zfsArcEnabled
=
1
;
}
else
{
fpl
->
zfsArcEnabled
=
0
;
}
int
smp
=
0
;
len
=
sizeof
(
smp
);
if
(
sysctlbyname
(
"kern.smp.active"
,
&
smp
,
&
len
,
NULL
,
0
)
!=
0
||
len
!=
sizeof
(
smp
))
{
smp
=
0
;
}
int
cpus
=
1
;
size_t
sizeof_cpus
=
sizeof
(
cpus
);
int
err
=
sysctlbyname
(
"hw.ncpu"
,
&
cpus
,
&
sizeof_cpus
,
NULL
,
0
);
if
(
err
)
cpus
=
1
;
len
=
sizeof
(
cpus
);
if
(
smp
)
{
int
err
=
sysctlbyname
(
"kern.smp.cpus"
,
&
cpus
,
&
len
,
NULL
,
0
);
if
(
err
)
cpus
=
1
;
}
else
{
cpus
=
1
;
}
size_t
sizeof_cp_time_array
=
sizeof
(
unsigned
long
)
*
CPUSTATES
;
len
=
2
;
sysctlnametomib
(
"kern.cp_time"
,
MIB_kern_cp_time
,
&
len
);
fpl
->
cp_time_o
=
calloc
(
cpus
,
sizeof_cp_time_array
);
fpl
->
cp_time_n
=
calloc
(
cpus
,
sizeof_cp_time_array
);
len
=
sizeof_cp_time_array
;
// fetch intial single (or average) CPU clicks from kernel
sysctl
(
MIB_kern_cp_time
,
2
,
fpl
->
cp_time_o
,
&
len
,
NULL
,
0
);
// on smp box, fetch rest of intial CPU's clicks
if
(
cpus
>
1
)
{
len
=
2
;
sysctlnametomib
(
"kern.cp_times"
,
MIB_kern_cp_times
,
&
len
);
fpl
->
cp_times_o
=
calloc
(
cpus
,
sizeof_cp_time_array
);
fpl
->
cp_times_n
=
calloc
(
cpus
,
sizeof_cp_time_array
);
len
=
cpus
*
sizeof_cp_time_array
;
sysctl
(
MIB_kern_cp_times
,
2
,
fpl
->
cp_times_o
,
&
len
,
NULL
,
0
);
}
pl
->
cpuCount
=
MAX
(
cpus
,
1
);
fpl
->
cpus
=
realloc
(
fpl
->
cpus
,
cpus
*
sizeof
(
CPUData
));
for
(
int
i
=
0
;
i
<
cpus
;
i
++
)
{
fpl
->
cpus
[
i
].
totalTime
=
1
;
fpl
->
cpus
[
i
].
totalPeriod
=
1
;
if
(
cpus
==
1
)
{
fpl
->
cpus
=
realloc
(
fpl
->
cpus
,
sizeof
(
CPUData
));
}
else
{
// on smp we need CPUs + 1 to store averages too (as kernel kindly provides that as well)
fpl
->
cpus
=
realloc
(
fpl
->
cpus
,
(
pl
->
cpuCount
+
1
)
*
sizeof
(
CPUData
));
}
size_t
len
;
len
=
4
;
sysctlnametomib
(
"vm.stats.vm.v_wire_count"
,
MIB_vm_stats_vm_v_wire_count
,
&
len
);
len
=
4
;
sysctlnametomib
(
"vm.stats.vm.v_cache_count"
,
MIB_vm_stats_vm_v_cache_count
,
&
len
);
len
=
2
;
sysctlnametomib
(
"hw.physmem"
,
MIB_hw_physmem
,
&
len
);
pageSizeKb
=
PAGE_SIZE_KB
;
len
=
sizeof
(
kernelFScale
);
if
(
sysctlbyname
(
"kern.fscale"
,
&
kernelFScale
,
&
len
,
NULL
,
0
)
==
-
1
)
{
//sane default for kernel provded CPU precentage scaling, at least on x86 machines, in case this sysctl call failed
kernelFScale
=
2048
;
}
fpl
->
kd
=
kvm_open
(
NULL
,
"/dev/null"
,
NULL
,
0
,
NULL
);
assert
(
fpl
->
kd
);
...
...
@@ -81,22 +188,150 @@ void ProcessList_delete(ProcessList* this) {
const
FreeBSDProcessList
*
fpl
=
(
FreeBSDProcessList
*
)
this
;
if
(
fpl
->
kd
)
kvm_close
(
fpl
->
kd
);
free
(
fpl
->
cp_time_o
);
free
(
fpl
->
cp_time_n
);
free
(
fpl
->
cp_times_o
);
free
(
fpl
->
cp_times_n
);
free
(
fpl
->
cpus
);
ProcessList_done
(
this
);
free
(
this
);
}
static
inline
void
FreeBSDProcessList_scan
MemoryInfo
(
ProcessList
*
pl
)
{
static
inline
void
FreeBSDProcessList_scan
CPUTime
(
ProcessList
*
pl
)
{
const
FreeBSDProcessList
*
fpl
=
(
FreeBSDProcessList
*
)
pl
;
int
cpus
=
pl
->
cpuCount
;
// actual CPU count
int
maxcpu
=
cpus
;
// max iteration (in case we have average + smp)
int
cp_times_offset
;
assert
(
cpus
>
0
);
size_t
sizeof_cp_time_array
;
unsigned
long
*
cp_time_n
;
// old clicks state
unsigned
long
*
cp_time_o
;
// current clicks state
unsigned
long
long
total_o
=
0
;
unsigned
long
long
total_n
=
0
;
unsigned
long
long
total_d
=
0
;
unsigned
long
cp_time_d
[
CPUSTATES
];
double
cp_time_p
[
CPUSTATES
];
// get averages or single CPU clicks
sizeof_cp_time_array
=
sizeof
(
unsigned
long
)
*
CPUSTATES
;
sysctl
(
MIB_kern_cp_time
,
2
,
fpl
->
cp_time_n
,
&
sizeof_cp_time_array
,
NULL
,
0
);
// get rest of CPUs
if
(
cpus
>
1
)
{
// on smp systems FreeBSD kernel concats all CPU states into one long array in
// kern.cp_times sysctl OID
// we store averages in fpl->cpus[0], and actual cores after that
maxcpu
=
cpus
+
1
;
sizeof_cp_time_array
=
cpus
*
sizeof
(
unsigned
long
)
*
CPUSTATES
;
sysctl
(
MIB_kern_cp_times
,
2
,
fpl
->
cp_times_n
,
&
sizeof_cp_time_array
,
NULL
,
0
);
}
for
(
int
i
=
0
;
i
<
maxcpu
;
i
++
)
{
if
(
cpus
==
1
)
{
// single CPU box
cp_time_n
=
fpl
->
cp_time_n
;
cp_time_o
=
fpl
->
cp_time_o
;
}
else
{
if
(
i
==
0
)
{
// average
cp_time_n
=
fpl
->
cp_time_n
;
cp_time_o
=
fpl
->
cp_time_o
;
}
else
{
// specific smp cores
cp_times_offset
=
i
-
1
;
cp_time_n
=
fpl
->
cp_times_n
+
(
cp_times_offset
*
CPUSTATES
);
cp_time_o
=
fpl
->
cp_times_o
+
(
cp_times_offset
*
CPUSTATES
);
}
}
// diff old vs new
for
(
int
s
=
0
;
s
<
CPUSTATES
;
s
++
)
{
cp_time_d
[
s
]
=
cp_time_n
[
s
]
-
cp_time_o
[
s
];
total_o
+=
cp_time_o
[
s
];
total_n
+=
cp_time_n
[
s
];
}
// totals
total_d
=
total_n
-
total_o
;
if
(
total_d
<
1
)
total_d
=
1
;
// save current state as old and calc percentages
for
(
int
s
=
0
;
s
<
CPUSTATES
;
++
s
)
{
cp_time_o
[
s
]
=
cp_time_n
[
s
];
cp_time_p
[
s
]
=
((
double
)
cp_time_d
[
s
])
/
((
double
)
total_d
)
*
100
;
}
CPUData
*
cpuData
=
&
(
fpl
->
cpus
[
i
]);
cpuData
->
userPercent
=
cp_time_p
[
CP_USER
];
cpuData
->
nicePercent
=
cp_time_p
[
CP_NICE
];
cpuData
->
systemPercent
=
cp_time_p
[
CP_SYS
];
cpuData
->
irqPercent
=
cp_time_p
[
CP_INTR
];
cpuData
->
systemAllPercent
=
cp_time_p
[
CP_SYS
]
+
cp_time_p
[
CP_INTR
];
// this one is not really used, but we store it anyway
cpuData
->
idlePercent
=
cp_time_p
[
CP_IDLE
];
}
}
static
inline
void
FreeBSDProcessList_scanMemoryInfo
(
ProcessList
*
pl
)
{
FreeBSDProcessList
*
fpl
=
(
FreeBSDProcessList
*
)
pl
;
// @etosan:
// memory counter relationships seem to be these:
// total = active + wired + inactive + cache + free
// htop_used (unavail to anybody) = active + wired
// htop_cache (for cache meter) = buffers + cache
// user_free (avail to procs) = buffers + inactive + cache + free
//
// with ZFS ARC situation becomes bit muddled, as ARC behaves like "user_free"
// and belongs into cache, but is reported as wired by kernel
//
// htop_used = active + (wired - arc)
// htop_cache = buffers + cache + arc
size_t
len
=
sizeof
(
pl
->
totalMem
);
//disabled for now, as it is always smaller than phycal amount of memory...
//...to avoid "where is my memory?" questions
//sysctl(MIB_vm_stats_vm_v_page_count, 4, &(pl->totalMem), &len, NULL, 0);
//pl->totalMem *= pageSizeKb;
sysctl
(
MIB_hw_physmem
,
2
,
&
(
pl
->
totalMem
),
&
len
,
NULL
,
0
);
pl
->
totalMem
/=
1024
;
sysctl
(
MIB_vm_stats_vm_v_wire_count
,
4
,
&
(
pl
->
usedMem
),
&
len
,
NULL
,
0
);
pl
->
usedMem
*=
pageSizeKb
;
pl
->
freeMem
=
pl
->
totalMem
-
pl
->
usedMem
;
sysctl
(
MIB_vm_stats_vm_v_active_count
,
4
,
&
(
fpl
->
memActive
),
&
len
,
NULL
,
0
);
fpl
->
memActive
*=
pageSizeKb
;
sysctl
(
MIB_vm_stats_vm_v_wire_count
,
4
,
&
(
fpl
->
memWire
),
&
len
,
NULL
,
0
);
fpl
->
memWire
*=
pageSizeKb
;
sysctl
(
MIB_vfs_bufspace
,
2
,
&
(
pl
->
buffersMem
),
&
len
,
NULL
,
0
);
pl
->
buffersMem
/=
1024
;
sysctl
(
MIB_vm_stats_vm_v_cache_count
,
4
,
&
(
pl
->
cachedMem
),
&
len
,
NULL
,
0
);
pl
->
cachedMem
*=
pageSizeKb
;
if
(
fpl
->
zfsArcEnabled
)
{
len
=
sizeof
(
fpl
->
memZfsArc
);
sysctl
(
MIB_kstat_zfs_misc_arcstats_size
,
5
,
&
(
fpl
->
memZfsArc
),
&
len
,
NULL
,
0
);
fpl
->
memZfsArc
/=
1024
;
fpl
->
memWire
-=
fpl
->
memZfsArc
;
pl
->
cachedMem
+=
fpl
->
memZfsArc
;
// maybe when we learn how to make custom memory meter
// we could do custom arc breakdown?
}
pl
->
usedMem
=
fpl
->
memActive
+
fpl
->
memWire
;
//currently unused, same as with arc, custom meter perhaps
//sysctl(MIB_vm_stats_vm_v_inactive_count, 4, &(fpl->memInactive), &len, NULL, 0);
//sysctl(MIB_vm_stats_vm_v_free_count, 4, &(fpl->memFree), &len, NULL, 0);
//pl->freeMem = fpl->memInactive + fpl->memFree;
//pl->freeMem *= pageSizeKb;
struct
kvm_swap
swap
[
16
];
int
nswap
=
kvm_getswapinfo
(
fpl
->
kd
,
swap
,
sizeof
(
swap
)
/
sizeof
(
swap
[
0
]),
0
);
pl
->
totalSwap
=
0
;
...
...
@@ -109,7 +344,6 @@ static inline void FreeBSDProcessList_scanMemoryInfo(ProcessList* pl) {
pl
->
usedSwap
*=
pageSizeKb
;
pl
->
sharedMem
=
0
;
// currently unused
pl
->
buffersMem
=
0
;
// not exposed to userspace
}
char
*
FreeBSDProcessList_readProcessName
(
kvm_t
*
kd
,
struct
kinfo_proc
*
kproc
,
int
*
basenameEnd
)
{
...
...
@@ -186,20 +420,21 @@ void ProcessList_goThroughEntries(ProcessList* this) {
bool
hideUserlandThreads
=
settings
->
hideUserlandThreads
;
FreeBSDProcessList_scanMemoryInfo
(
this
);
FreeBSDProcessList_scanCPUTime
(
this
);
int
cpus
=
this
->
cpuCount
;
int
count
=
0
;
struct
kinfo_proc
*
kprocs
=
kvm_getprocs
(
fpl
->
kd
,
KERN_PROC_ALL
,
0
,
&
count
);
for
(
int
i
=
0
;
i
<
count
;
i
++
)
{
struct
kinfo_proc
*
kproc
=
&
kprocs
[
i
];
bool
preExisting
=
false
;
bool
isIdleProcess
=
false
;
Process
*
proc
=
ProcessList_getProcess
(
this
,
kproc
->
ki_pid
,
&
preExisting
,
(
Process_New
)
FreeBSDProcess_new
);
FreeBSDProcess
*
fp
=
(
FreeBSDProcess
*
)
proc
;
proc
->
show
=
!
((
hideKernelThreads
&&
Process_isKernelThread
(
fp
))
||
(
hideUserlandThreads
&&
Process_isUserlandThread
(
proc
)));
if
(
!
preExisting
)
{
fp
->
jid
=
kproc
->
ki_jid
;
proc
->
pid
=
kproc
->
ki_pid
;
...
...
@@ -207,6 +442,7 @@ void ProcessList_goThroughEntries(ProcessList* this) {
fp
->
kernel
=
1
;
else
fp
->
kernel
=
0
;
proc
->
ppid
=
kproc
->
ki_ppid
;
proc
->
tpgid
=
kproc
->
ki_tpgid
;
proc
->
tgid
=
kproc
->
ki_pid
;
proc
->
session
=
kproc
->
ki_sid
;
...
...
@@ -220,27 +456,51 @@ void ProcessList_goThroughEntries(ProcessList* this) {
fp
->
jname
=
FreeBSDProcessList_readJailName
(
kproc
);
}
else
{
if
(
fp
->
jid
!=
kproc
->
ki_jid
)
{
// proces can enter jail anytime
fp
->
jid
=
kproc
->
ki_jid
;
free
(
fp
->
jname
);
fp
->
jname
=
FreeBSDProcessList_readJailName
(
kproc
);
}
if
(
proc
->
ppid
!=
kproc
->
ki_ppid
)
{
// if there are reapers in the system, proces can get reparented anytime
proc
->
ppid
=
kproc
->
ki_ppid
;
}
if
(
proc
->
st_uid
!=
kproc
->
ki_uid
)
{
// some proceses change users (eg. to lower privs)
proc
->
st_uid
=
kproc
->
ki_uid
;
proc
->
user
=
UsersTable_getRef
(
this
->
usersTable
,
proc
->
st_uid
);
}
if
(
settings
->
updateProcessNames
)
{
free
(
proc
->
comm
);
proc
->
comm
=
FreeBSDProcessList_readProcessName
(
fpl
->
kd
,
kproc
,
&
proc
->
basenameOffset
);
}
}
proc
->
ppid
=
kproc
->
ki_ppid
;
proc
->
m_size
=
kproc
->
ki_size
/
pageSizeKb
/
1000
;
proc
->
m_resident
=
kproc
->
ki_rssize
;
// * pageSizeKb;
// from FreeBSD source /src/usr.bin/top/machine.c
proc
->
m_size
=
kproc
->
ki_size
/
1024
;
proc
->
m_resident
=
kproc
->
ki_rssize
*
pageSizeKb
;
proc
->
nlwp
=
kproc
->
ki_numthreads
;
proc
->
time
=
(
kproc
->
ki_runtime
+
5000
)
/
10000
;
proc
->
percent_cpu
=
100
.
0
*
((
double
)
kproc
->
ki_pctcpu
/
(
double
)
kernelFScale
);
if
(
proc
->
percent_cpu
>
0
.
1
)
{
// system idle process should own all CPU time left regardless of CPU count
if
(
strcmp
(
"idle"
,
kproc
->
ki_comm
)
==
0
)
{
isIdleProcess
=
true
;
}
else
{
if
(
cpus
>
1
)
proc
->
percent_cpu
=
proc
->
percent_cpu
/
(
double
)
cpus
;
}
}
if
(
isIdleProcess
==
false
&&
proc
->
percent_cpu
>=
99
.
8
)
{
// don't break formatting
proc
->
percent_cpu
=
99
.
8
;
}
proc
->
priority
=
kproc
->
ki_pri
.
pri_level
-
PZERO
;
if
(
strcmp
(
"intr"
,
kproc
->
ki_comm
)
==
0
&&
kproc
->
ki_flag
&
P_SYSTEM
)
{
proc
->
nice
=
0
;
//@etosan:
freebsd
intr kernel process (not thread) has weird nice value
proc
->
nice
=
0
;
//@etosan: intr kernel process (not thread) has weird nice value
}
else
if
(
kproc
->
ki_pri
.
pri_class
==
PRI_TIMESHARE
)
{
proc
->
nice
=
kproc
->
ki_nice
-
NZERO
;
}
else
if
(
PRI_IS_REALTIME
(
kproc
->
ki_pri
.
pri_class
))
{
...
...
@@ -249,7 +509,6 @@ void ProcessList_goThroughEntries(ProcessList* this) {
proc
->
nice
=
PRIO_MAX
+
1
+
kproc
->
ki_pri
.
pri_level
-
PRI_MIN_IDLE
;
}
switch
(
kproc
->
ki_stat
)
{
case
SIDL
:
proc
->
state
=
'I'
;
break
;
case
SRUN
:
proc
->
state
=
'R'
;
break
;
...
...
freebsd/Platform.c
View file @
b10e54cd
...
...
@@ -16,6 +16,7 @@ in the source distribution for its full text.
#include "ClockMeter.h"
#include "HostnameMeter.h"
#include "FreeBSDProcess.h"
#include "FreeBSDProcessList.h"
#include <sys/types.h>
#include <sys/sysctl.h>
...
...
@@ -105,7 +106,7 @@ int Platform_getUptime() {
struct
timeval
bootTime
,
currTime
;
int
mib
[
2
]
=
{
CTL_KERN
,
KERN_BOOTTIME
};
size_t
size
=
sizeof
(
bootTime
);
int
err
=
sysctl
(
mib
,
2
,
&
bootTime
,
&
size
,
NULL
,
0
);
if
(
err
)
{
return
-
1
;
...
...
@@ -119,7 +120,7 @@ void Platform_getLoadAverage(double* one, double* five, double* fifteen) {
struct
loadavg
loadAverage
;
int
mib
[
2
]
=
{
CTL_VM
,
VM_LOADAVG
};
size_t
size
=
sizeof
(
loadAverage
);
int
err
=
sysctl
(
mib
,
2
,
&
loadAverage
,
&
size
,
NULL
,
0
);
if
(
err
)
{
*
one
=
0
;
...
...
@@ -143,15 +144,52 @@ int Platform_getMaxPid() {
}
double
Platform_setCPUValues
(
Meter
*
this
,
int
cpu
)
{
// TODO
FreeBSDProcessList
*
fpl
=
(
FreeBSDProcessList
*
)
this
->
pl
;
int
cpus
=
this
->
pl
->
cpuCount
;
CPUData
*
cpuData
;
if
(
cpus
==
1
)
{
// single CPU box has everything in fpl->cpus[0]
cpuData
=
&
(
fpl
->
cpus
[
0
]);
}
else
{
cpuData
=
&
(
fpl
->
cpus
[
cpu
]);
}
double
percent
;
double
*
v
=
this
->
values
;
v
[
CPU_METER_NICE
]
=
cpuData
->
nicePercent
;
v
[
CPU_METER_NORMAL
]
=
cpuData
->
userPercent
;
if
(
this
->
pl
->
settings
->
detailedCPUTime
)
{
v
[
CPU_METER_KERNEL
]
=
cpuData
->
systemPercent
;
v
[
CPU_METER_IRQ
]
=
cpuData
->
irqPercent
;
Meter_setItems
(
this
,
4
);
percent
=
v
[
0
]
+
v
[
1
]
+
v
[
2
]
+
v
[
3
];
}
else
{
v
[
2
]
=
cpuData
->
systemAllPercent
;
Meter_setItems
(
this
,
3
);
percent
=
v
[
0
]
+
v
[
1
]
+
v
[
2
];
}
percent
=
MIN
(
100
.
0
,
MAX
(
0
.
0
,
percent
));
if
(
isnan
(
percent
))
percent
=
0
.
0
;
return
percent
;
}
void
Platform_setMemoryValues
(
Meter
*
this
)
{
// TODO
ProcessList
*
pl
=
(
ProcessList
*
)
this
->
pl
;
this
->
total
=
pl
->
totalMem
;
this
->
values
[
0
]
=
pl
->
usedMem
;
this
->
values
[
1
]
=
pl
->
buffersMem
;
this
->
values
[
2
]
=
pl
->
cachedMem
;
}
void
Platform_setSwapValues
(
Meter
*
this
)
{
// TODO
ProcessList
*
pl
=
(
ProcessList
*
)
this
->
pl
;
this
->
total
=
pl
->
totalSwap
;
this
->
values
[
0
]
=
pl
->
usedSwap
;
}
void
Platform_setTasksValues
(
Meter
*
this
)
{
...
...
htop.c
View file @
b10e54cd
...
...
@@ -44,7 +44,7 @@ static void printHelpFlag() {
"-s --sort-key=COLUMN Sort by COLUMN (try --sort-key=help for a list)
\n
"
"-u --user=USERNAME Show only processes of a given user
\n
"
"-p --pid=PID,[,PID,PID...] Show only the given PIDs
\n
"
"-v --version Print version info
\n
"
"-v --version
Print version info
\n
"
"
\n
"
"Long options may be passed with a single dash.
\n\n
"
"Press F1 inside htop for online help.
\n
"
...
...
linux/LinuxCRT.c
View file @
b10e54cd
...
...
@@ -30,7 +30,7 @@ void CRT_handleSIGSEGV(int sgn) {
#endif
#else
fprintf
(
stderr
,
"
\n
Unfortunately, you seem to be using an unsupported platform!"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package mantainer!
\n\n
"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package ma
i
ntainer!
\n\n
"
);
#endif
abort
();
}
linux/LinuxProcessList.c
View file @
b10e54cd
...
...
@@ -78,6 +78,10 @@ typedef struct LinuxProcessList_ {
#define PROCMEMINFOFILE PROCDIR "/meminfo"
#endif
#ifndef PROC_LINE_LENGTH
#define PROC_LINE_LENGTH 512
#endif
}*/
ProcessList
*
ProcessList_new
(
UsersTable
*
usersTable
,
Hashtable
*
pidWhiteList
,
uid_t
userId
)
{
...
...
@@ -90,11 +94,11 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, ui
if
(
file
==
NULL
)
{
CRT_fatalError
(
"Cannot open "
PROCSTATFILE
);
}
char
buffer
[
256
];
char
buffer
[
PROC_LINE_LENGTH
+
1
];
int
cpus
=
-
1
;
do
{
cpus
++
;
char
*
s
=
fgets
(
buffer
,
255
,
file
);
char
*
s
=
fgets
(
buffer
,
PROC_LINE_LENGTH
,
file
);
(
void
)
s
;
}
while
(
String_startsWith
(
buffer
,
"cpu"
));
fclose
(
file
);
...
...
@@ -306,8 +310,8 @@ static bool LinuxProcessList_readStatmFile(LinuxProcess* process, const char* di
int
fd
=
open
(
filename
,
O_RDONLY
);
if
(
fd
==
-
1
)
return
false
;
char
buf
[
256
];
ssize_t
rres
=
xread
(
fd
,
buf
,
255
);
char
buf
[
PROC_LINE_LENGTH
+
1
];
ssize_t
rres
=
xread
(
fd
,
buf
,
PROC_LINE_LENGTH
);
close
(
fd
);
if
(
rres
<
1
)
return
false
;
...
...
@@ -361,13 +365,13 @@ static void LinuxProcessList_readCGroupFile(LinuxProcess* process, const char* d
process
->
cgroup
=
strdup
(
""
);
return
;
}
char
output
[
256
];
char
output
[
PROC_LINE_LENGTH
+
1
];
output
[
0
]
=
'\0'
;
char
*
at
=
output
;
int
left
=
255
;
int
left
=
PROC_LINE_LENGTH
;
while
(
!
feof
(
file
)
&&
left
>
0
)
{
char
buffer
[
256
];
char
*
ok
=
fgets
(
buffer
,
255
,
file
);
char
buffer
[
PROC_LINE_LENGTH
+
1
];
char
*
ok
=
fgets
(
buffer
,
PROC_LINE_LENGTH
,
file
);
if
(
!
ok
)
break
;
char
*
group
=
strchr
(
buffer
,
':'
);
if
(
!
group
)
break
;
...
...
@@ -394,9 +398,9 @@ static void LinuxProcessList_readVServerData(LinuxProcess* process, const char*
FILE
*
file
=
fopen
(
filename
,
"r"
);
if
(
!
file
)
return
;
char
buffer
[
256
];
char
buffer
[
PROC_LINE_LENGTH
+
1
];
process
->
vxid
=
0
;
while
(
fgets
(
buffer
,
255
,
file
))
{
while
(
fgets
(
buffer
,
PROC_LINE_LENGTH
,
file
))
{
if
(
String_startsWith
(
buffer
,
"VxID:"
))
{
int
vxid
;
int
ok
=
sscanf
(
buffer
,
"VxID:
\t
%32d"
,
&
vxid
);
...
...
@@ -425,8 +429,8 @@ static void LinuxProcessList_readOomData(LinuxProcess* process, const char* dirn
FILE
*
file
=
fopen
(
filename
,
"r"
);
if
(
!
file
)
return
;
char
buffer
[
256
];
if
(
fgets
(
buffer
,
255
,
file
))
{
char
buffer
[
PROC_LINE_LENGTH
+
1
];
if
(
fgets
(
buffer
,
PROC_LINE_LENGTH
,
file
))
{
unsigned
int
oom
;
int
ok
=
sscanf
(
buffer
,
"%32u"
,
&
oom
);
if
(
ok
>=
1
)
{
...
...
@@ -677,14 +681,14 @@ static inline double LinuxProcessList_scanCPUTime(LinuxProcessList* this) {
int
cpus
=
this
->
super
.
cpuCount
;
assert
(
cpus
>
0
);
for
(
int
i
=
0
;
i
<=
cpus
;
i
++
)
{
char
buffer
[
256
];
char
buffer
[
PROC_LINE_LENGTH
+
1
];
unsigned
long
long
int
usertime
,
nicetime
,
systemtime
,
idletime
;
unsigned
long
long
int
ioWait
,
irq
,
softIrq
,
steal
,
guest
,
guestnice
;
ioWait
=
irq
=
softIrq
=
steal
=
guest
=
guestnice
=
0
;
// Depending on your kernel version,
// 5, 7, 8 or 9 of these fields will be set.
// The rest will remain at zero.
char
*
ok
=
fgets
(
buffer
,
255
,
file
);
char
*
ok
=
fgets
(
buffer
,
PROC_LINE_LENGTH
,
file
);
if
(
!
ok
)
buffer
[
0
]
=
'\0'
;
if
(
i
==
0
)
sscanf
(
buffer
,
"cpu %16llu %16llu %16llu %16llu %16llu %16llu %16llu %16llu %16llu %16llu"
,
&
usertime
,
&
nicetime
,
&
systemtime
,
&
idletime
,
&
ioWait
,
&
irq
,
&
softIrq
,
&
steal
,
&
guest
,
&
guestnice
);
...
...
linux/LinuxProcessList.h
View file @
b10e54cd
...
...
@@ -59,6 +59,10 @@ typedef struct LinuxProcessList_ {
#define PROCMEMINFOFILE PROCDIR "/meminfo"
#endif
#ifndef PROC_LINE_LENGTH
#define PROC_LINE_LENGTH 512
#endif
ProcessList
*
ProcessList_new
(
UsersTable
*
usersTable
,
Hashtable
*
pidWhiteList
,
uid_t
userId
);
...
...
openbsd/OpenBSDCRT.c
View file @
b10e54cd
...
...
@@ -16,7 +16,7 @@ void CRT_handleSIGSEGV(int sgn) {
CRT_done
();
fprintf
(
stderr
,
"
\n\n
htop "
VERSION
" aborting.
\n
"
);
fprintf
(
stderr
,
"
\n
Unfortunately, you seem to be using an unsupported platform!"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package mantainer!
\n\n
"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package ma
i
ntainer!
\n\n
"
);
abort
();
}
openbsd/OpenBSDProcessList.c
View file @
b10e54cd
...
...
@@ -12,6 +12,7 @@ in the source distribution for its full text.
#include <unistd.h>
#include <stdlib.h>
#include <err.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/param.h>
...
...
@@ -47,37 +48,41 @@ static long fscale;
ProcessList
*
ProcessList_new
(
UsersTable
*
usersTable
,
Hashtable
*
pidWhiteList
,
uid_t
userId
)
{
int
mib
[]
=
{
CTL_HW
,
HW_NCPU
};
int
fmib
[]
=
{
CTL_KERN
,
KERN_FSCALE
};
int
i
;
OpenBSDProcessList
*
f
pl
=
calloc
(
1
,
sizeof
(
OpenBSDProcessList
));
ProcessList
*
pl
=
(
ProcessList
*
)
f
pl
;
int
i
,
e
;
OpenBSDProcessList
*
o
pl
=
calloc
(
1
,
sizeof
(
OpenBSDProcessList
));
ProcessList
*
pl
=
(
ProcessList
*
)
o
pl
;
size_t
size
=
sizeof
(
pl
->
cpuCount
);
ProcessList_init
(
pl
,
Class
(
OpenBSDProcess
),
usersTable
,
pidWhiteList
,
userId
);
pl
->
cpuCount
=
1
;
// default to 1 on sysctl() error
(
void
)
sysctl
(
mib
,
2
,
&
pl
->
cpuCount
,
&
size
,
NULL
,
0
);
fpl
->
cpus
=
realloc
(
fpl
->
cpus
,
pl
->
cpuCount
*
sizeof
(
CPUData
));
e
=
sysctl
(
mib
,
2
,
&
pl
->
cpuCount
,
&
size
,
NULL
,
0
);
if
(
e
==
-
1
||
pl
->
cpuCount
<
1
)
{
pl
->
cpuCount
=
1
;
}
opl
->
cpus
=
realloc
(
opl
->
cpus
,
pl
->
cpuCount
*
sizeof
(
CPUData
));
size
=
sizeof
(
fscale
);
if
(
sysctl
(
fmib
,
2
,
&
fscale
,
&
size
,
NULL
,
0
)
<
0
)
CRT_fatalError
(
"fscale sysctl call failed"
);
err
(
1
,
"fscale sysctl call failed"
);
for
(
i
=
0
;
i
<
pl
->
cpuCount
;
i
++
)
{
f
pl
->
cpus
[
i
].
totalTime
=
1
;
f
pl
->
cpus
[
i
].
totalPeriod
=
1
;
o
pl
->
cpus
[
i
].
totalTime
=
1
;
o
pl
->
cpus
[
i
].
totalPeriod
=
1
;
}
pageSizeKb
=
PAGE_SIZE_KB
;
// XXX: last arg should eventually be an errbuf
f
pl
->
kd
=
kvm_open
(
NULL
,
NULL
,
NULL
,
KVM_NO_FILES
,
NULL
);
assert
(
f
pl
->
kd
);
o
pl
->
kd
=
kvm_open
(
NULL
,
NULL
,
NULL
,
KVM_NO_FILES
,
NULL
);
assert
(
o
pl
->
kd
);
return
pl
;
}
void
ProcessList_delete
(
ProcessList
*
this
)
{
const
OpenBSDProcessList
*
fpl
=
(
OpenBSDProcessList
*
)
this
;
if
(
fpl
->
kd
)
kvm_close
(
fpl
->
kd
);
const
OpenBSDProcessList
*
opl
=
(
OpenBSDProcessList
*
)
this
;
if
(
opl
->
kd
)
kvm_close
(
opl
->
kd
);
free
(
opl
->
cpus
);
ProcessList_done
(
this
);
free
(
this
);
...
...
@@ -89,7 +94,7 @@ static inline void OpenBSDProcessList_scanMemoryInfo(ProcessList* pl) {
size_t
size
=
sizeof
(
uvmexp
);
if
(
sysctl
(
uvmexp_mib
,
2
,
&
uvmexp
,
&
size
,
NULL
,
0
)
<
0
)
{
CRT_fatalError
(
"uvmexp sysctl call failed"
);
err
(
1
,
"uvmexp sysctl call failed"
);
}
//kb_pagesize = uvmexp.pagesize / 1024;
...
...
@@ -97,7 +102,7 @@ static inline void OpenBSDProcessList_scanMemoryInfo(ProcessList* pl) {
pl
->
totalMem
=
uvmexp
.
npages
*
pageSizeKb
;
/*
const OpenBSDProcessList*
f
pl = (OpenBSDProcessList*) pl;
const OpenBSDProcessList*
o
pl = (OpenBSDProcessList*) pl;
size_t len = sizeof(pl->totalMem);
sysctl(MIB_hw_physmem, 2, &(pl->totalMem), &len, NULL, 0);
...
...
@@ -109,7 +114,7 @@ static inline void OpenBSDProcessList_scanMemoryInfo(ProcessList* pl) {
pl->cachedMem *= pageSizeKb;
struct kvm_swap swap[16];
int nswap = kvm_getswapinfo(
f
pl->kd, swap, sizeof(swap)/sizeof(swap[0]), 0);
int nswap = kvm_getswapinfo(
o
pl->kd, swap, sizeof(swap)/sizeof(swap[0]), 0);
pl->totalSwap = 0;
pl->usedSwap = 0;
for (int i = 0; i < nswap; i++) {
...
...
@@ -125,34 +130,41 @@ static inline void OpenBSDProcessList_scanMemoryInfo(ProcessList* pl) {
}
char
*
OpenBSDProcessList_readProcessName
(
kvm_t
*
kd
,
struct
kinfo_proc
*
kproc
,
int
*
basenameEnd
)
{
char
*
str
,
*
buf
,
**
argv
;
size_t
cpsz
;
size_t
len
=
500
;
argv
=
kvm_getargv
(
kd
,
kproc
,
500
);
if
(
argv
==
NULL
)
CRT_fatalError
(
"kvm call failed"
);
str
=
buf
=
malloc
(
len
+
1
);
if
(
str
==
NULL
)
CRT_fatalError
(
"out of memory"
);
while
(
*
argv
!=
NULL
)
{
cpsz
=
MIN
(
len
,
strlen
(
*
argv
));
strncpy
(
buf
,
*
argv
,
cpsz
);
buf
+=
cpsz
;
len
-=
cpsz
;
argv
++
;
if
(
len
>
0
)
{
*
buf
=
' '
;
buf
++
;
len
--
;
}
}
char
*
s
,
*
buf
,
**
arg
;
size_t
cpsz
,
len
=
0
,
n
;
int
i
;
*
buf
=
'\0'
;
return
str
;
/*
* We attempt to fall back to just the command name (argv[0]) if we
* fail to construct the full command at any point.
*/
arg
=
kvm_getargv
(
kd
,
kproc
,
500
);
if
(
arg
==
NULL
)
{
if
((
s
=
strdup
(
kproc
->
p_comm
))
==
NULL
)
{
err
(
1
,
NULL
);
}
return
s
;
}
for
(
i
=
0
;
arg
[
i
]
!=
NULL
;
i
++
)
{
len
+=
strlen
(
arg
[
i
])
+
1
;
}
if
((
buf
=
s
=
malloc
(
len
))
==
NULL
)
{
if
((
s
=
strdup
(
kproc
->
p_comm
))
==
NULL
)
{
err
(
1
,
NULL
);
}
return
s
;
}
for
(
i
=
0
;
arg
[
i
]
!=
NULL
;
i
++
)
{
n
=
strlcpy
(
buf
,
arg
[
i
],
(
s
+
len
)
-
buf
);
buf
+=
n
;
if
(
i
==
0
)
{
*
basenameEnd
=
n
;
}
*
buf
=
' '
;
buf
++
;
}
*
(
buf
-
1
)
=
'\0'
;
return
s
;
}
/*
...
...
@@ -168,7 +180,7 @@ double getpcpu(const struct kinfo_proc *kp) {
}
void
ProcessList_goThroughEntries
(
ProcessList
*
this
)
{
OpenBSDProcessList
*
f
pl
=
(
OpenBSDProcessList
*
)
this
;
OpenBSDProcessList
*
o
pl
=
(
OpenBSDProcessList
*
)
this
;
Settings
*
settings
=
this
->
settings
;
bool
hideKernelThreads
=
settings
->
hideKernelThreads
;
bool
hideUserlandThreads
=
settings
->
hideUserlandThreads
;
...
...
@@ -182,7 +194,7 @@ void ProcessList_goThroughEntries(ProcessList* this) {
OpenBSDProcessList_scanMemoryInfo
(
this
);
// use KERN_PROC_KTHREAD to also include kernel threads
struct
kinfo_proc
*
kprocs
=
kvm_getprocs
(
f
pl
->
kd
,
KERN_PROC_ALL
,
0
,
sizeof
(
struct
kinfo_proc
),
&
count
);
struct
kinfo_proc
*
kprocs
=
kvm_getprocs
(
o
pl
->
kd
,
KERN_PROC_ALL
,
0
,
sizeof
(
struct
kinfo_proc
),
&
count
);
//struct kinfo_proc* kprocs = getprocs(KERN_PROC_ALL, 0, &count);
for
(
i
=
0
;
i
<
count
;
i
++
)
{
...
...
@@ -206,11 +218,11 @@ void ProcessList_goThroughEntries(ProcessList* this) {
proc
->
starttime_ctime
=
kproc
->
p_ustart_sec
;
proc
->
user
=
UsersTable_getRef
(
this
->
usersTable
,
proc
->
st_uid
);
ProcessList_add
((
ProcessList
*
)
this
,
proc
);
proc
->
comm
=
OpenBSDProcessList_readProcessName
(
f
pl
->
kd
,
kproc
,
&
proc
->
basenameOffset
);
proc
->
comm
=
OpenBSDProcessList_readProcessName
(
o
pl
->
kd
,
kproc
,
&
proc
->
basenameOffset
);
}
else
{
if
(
settings
->
updateProcessNames
)
{
free
(
proc
->
comm
);
proc
->
comm
=
OpenBSDProcessList_readProcessName
(
f
pl
->
kd
,
kproc
,
&
proc
->
basenameOffset
);
proc
->
comm
=
OpenBSDProcessList_readProcessName
(
o
pl
->
kd
,
kproc
,
&
proc
->
basenameOffset
);
}
}
...
...
openbsd/Platform.h
View file @
b10e54cd
...
...
@@ -11,6 +11,7 @@ in the source distribution for its full text.
*/
#include "Action.h"
#include "SignalsPanel.h"
#include "BatteryMeter.h"
extern
ProcessFieldData
Process_fields
[];
...
...
unsupported/UnsupportedCRT.c
View file @
b10e54cd
...
...
@@ -15,7 +15,7 @@ void CRT_handleSIGSEGV(int sgn) {
CRT_done
();
fprintf
(
stderr
,
"
\n\n
htop "
VERSION
" aborting.
\n
"
);
fprintf
(
stderr
,
"
\n
Unfortunately, you seem to be using an unsupported platform!"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package mantainer!
\n\n
"
);
fprintf
(
stderr
,
"
\n
Please contact your platform package ma
i
ntainer!
\n\n
"
);
abort
();
}
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