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
c8cadfb9
"LICENCE.IntcSST2" did not exist on "caef650a8c909f557ed7f6b23c413401d6994fdb"
Commit
c8cadfb9
authored
Dec 23, 2015
by
Hisham Muhammad
Browse files
Merge branch 'master' of
https://github.com/hishamhm/htop
parents
802e2168
526eca9a
Changes
4
Show whitespace changes
Inline
Side-by-side
IncSet.c
View file @
c8cadfb9
...
...
@@ -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
;
...
...
MetersPanel.c
View file @
c8cadfb9
...
...
@@ -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
;
...
...
freebsd/FreeBSDProcessList.c
View file @
c8cadfb9
...
...
@@ -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
);
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,149 @@ void ProcessList_delete(ProcessList* this) {
const
FreeBSDProcessList
*
fpl
=
(
FreeBSDProcessList
*
)
this
;
if
(
fpl
->
kd
)
kvm_close
(
fpl
->
kd
);
if
(
fpl
->
cp_time_o
!=
NULL
)
free
(
fpl
->
cp_time_o
);
if
(
fpl
->
cp_time_n
!=
NULL
)
free
(
fpl
->
cp_time_n
);
if
(
fpl
->
cp_times_o
!=
NULL
)
free
(
fpl
->
cp_times_o
);
if
(
fpl
->
cp_times_n
!=
NULL
)
free
(
fpl
->
cp_times_n
);
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 +343,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 +419,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 +441,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 +455,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 +508,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 @
c8cadfb9
...
...
@@ -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>
...
...
@@ -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
)
{
...
...
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