aboutsummaryrefslogtreecommitdiffstats
path: root/freebsd
diff options
context:
space:
mode:
authorDaniel Lange <DLange@git.local>2020-08-27 07:48:10 +0200
committerDaniel Lange <DLange@git.local>2020-08-27 07:48:10 +0200
commitf3147ea2d1598914c2db53e8cfb34c8ff81e2ff4 (patch)
tree3ee82b2af2ab3d38b6e4b07f3994516aac72f742 /freebsd
parentdf568a576f7b44ac5a2b9b7222c7f39d9932f626 (diff)
downloaddebian_htop-f3147ea2d1598914c2db53e8cfb34c8ff81e2ff4.tar.gz
debian_htop-f3147ea2d1598914c2db53e8cfb34c8ff81e2ff4.tar.bz2
debian_htop-f3147ea2d1598914c2db53e8cfb34c8ff81e2ff4.zip
New upstream version 3.0.0upstream/3.0.0
Diffstat (limited to 'freebsd')
-rw-r--r--freebsd/FreeBSDCRT.c1
-rw-r--r--freebsd/FreeBSDProcess.c4
-rw-r--r--freebsd/FreeBSDProcessList.c87
-rw-r--r--freebsd/FreeBSDProcessList.h6
-rw-r--r--freebsd/Platform.c19
-rw-r--r--freebsd/Platform.h4
6 files changed, 77 insertions, 44 deletions
diff --git a/freebsd/FreeBSDCRT.c b/freebsd/FreeBSDCRT.c
index 5c3a9de..49cc5d0 100644
--- a/freebsd/FreeBSDCRT.c
+++ b/freebsd/FreeBSDCRT.c
@@ -18,4 +18,3 @@ void CRT_handleSIGSEGV(int sgn) {
fprintf(stderr, "\nPlease contact your platform package maintainer!\n\n");
abort();
}
-
diff --git a/freebsd/FreeBSDProcess.c b/freebsd/FreeBSDProcess.c
index f81fadf..c8d30f6 100644
--- a/freebsd/FreeBSDProcess.c
+++ b/freebsd/FreeBSDProcess.c
@@ -73,7 +73,7 @@ ProcessFieldData Process_fields[] = {
[PROCESSOR] = { .name = "PROCESSOR", .title = "CPU ", .description = "Id of the CPU the process last executed on", .flags = 0, },
[M_SIZE] = { .name = "M_SIZE", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, },
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, },
- [ST_UID] = { .name = "ST_UID", .title = " UID ", .description = "User ID of the process owner", .flags = 0, },
+ [ST_UID] = { .name = "ST_UID", .title = " UID ", .description = "User ID of the process owner", .flags = 0, },
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, },
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, },
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
@@ -119,7 +119,7 @@ void FreeBSDProcess_writeField(Process* this, RichString* str, ProcessField fiel
// add FreeBSD-specific fields here
case JID: xSnprintf(buffer, n, Process_pidFormat, fp->jid); break;
case JAIL:{
- xSnprintf(buffer, n, "%-11s ", fp->jname); break;
+ xSnprintf(buffer, n, "%-11s ", fp->jname);
if (buffer[11] != '\0') {
buffer[11] = ' ';
buffer[12] = '\0';
diff --git a/freebsd/FreeBSDProcessList.c b/freebsd/FreeBSDProcessList.c
index 9fef324..8c892a0 100644
--- a/freebsd/FreeBSDProcessList.c
+++ b/freebsd/FreeBSDProcessList.c
@@ -8,6 +8,8 @@ in the source distribution for its full text.
#include "ProcessList.h"
#include "FreeBSDProcessList.h"
#include "FreeBSDProcess.h"
+#include "zfs/ZfsArcStats.h"
+#include "zfs/openzfs_sysctl.h"
#include <unistd.h>
#include <stdlib.h>
@@ -18,9 +20,12 @@ in the source distribution for its full text.
#include <fcntl.h>
#include <limits.h>
#include <string.h>
+#include <time.h>
/*{
+#include "zfs/ZfsArcStats.h"
+
#include <kvm.h>
#include <sys/param.h>
#include <sys/jail.h>
@@ -45,14 +50,12 @@ 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;
+ ZfsArcStats zfs;
CPUData* cpus;
@@ -80,8 +83,6 @@ 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;
@@ -118,15 +119,8 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, ui
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;
- }
-
+ openzfs_sysctl_init(&fpl->zfs);
+ openzfs_sysctl_updateArcStats(&fpl->zfs);
int smp = 0;
len = sizeof(smp);
@@ -296,35 +290,44 @@ static inline void FreeBSDProcessList_scanMemoryInfo(ProcessList* pl) {
//
// htop_used = active + (wired - arc)
// htop_cache = buffers + cache + arc
- size_t len = sizeof(pl->totalMem);
+ u_long totalMem;
+ u_int memActive, memWire, cachedMem;
+ long buffersMem;
+ uint64_t memZfsArc;
+ size_t len;
//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_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?
+ len = sizeof(totalMem);
+ sysctl(MIB_hw_physmem, 2, &(totalMem), &len, NULL, 0);
+ totalMem /= 1024;
+ pl->totalMem = totalMem;
+
+ len = sizeof(memActive);
+ sysctl(MIB_vm_stats_vm_v_active_count, 4, &(memActive), &len, NULL, 0);
+ memActive *= pageSizeKb;
+ fpl->memActive = memActive;
+
+ len = sizeof(memWire);
+ sysctl(MIB_vm_stats_vm_v_wire_count, 4, &(memWire), &len, NULL, 0);
+ memWire *= pageSizeKb;
+ fpl->memWire = memWire;
+
+ len = sizeof(buffersMem);
+ sysctl(MIB_vfs_bufspace, 2, &(buffersMem), &len, NULL, 0);
+ buffersMem /= 1024;
+ pl->buffersMem = buffersMem;
+
+ len = sizeof(cachedMem);
+ sysctl(MIB_vm_stats_vm_v_cache_count, 4, &(cachedMem), &len, NULL, 0);
+ cachedMem *= pageSizeKb;
+ pl->cachedMem = cachedMem;
+
+ if (fpl->zfs.enabled) {
+ fpl->memWire -= fpl->zfs.size;
+ pl->cachedMem += fpl->zfs.size;
}
pl->usedMem = fpl->memActive + fpl->memWire;
@@ -422,6 +425,7 @@ void ProcessList_goThroughEntries(ProcessList* this) {
bool hideKernelThreads = settings->hideKernelThreads;
bool hideUserlandThreads = settings->hideUserlandThreads;
+ openzfs_sysctl_updateArcStats(&fpl->zfs);
FreeBSDProcessList_scanMemoryInfo(this);
FreeBSDProcessList_scanCPUTime(this);
@@ -429,10 +433,14 @@ void ProcessList_goThroughEntries(ProcessList* this) {
int count = 0;
struct kinfo_proc* kprocs = kvm_getprocs(fpl->kd, KERN_PROC_PROC, 0, &count);
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+
for (int i = 0; i < count; i++) {
struct kinfo_proc* kproc = &kprocs[i];
bool preExisting = false;
bool isIdleProcess = false;
+ struct tm date;
Process* proc = ProcessList_getProcess(this, kproc->ki_pid, &preExisting, (Process_New) FreeBSDProcess_new);
FreeBSDProcess* fp = (FreeBSDProcess*) proc;
@@ -523,6 +531,9 @@ void ProcessList_goThroughEntries(ProcessList* this) {
this->kernelThreads++;
}
+ (void) localtime_r((time_t*) &proc->starttime_ctime, &date);
+ strftime(proc->starttime_show, 7, ((proc->starttime_ctime > tv.tv_sec - 86400) ? "%R " : "%b%d "), &date);
+
this->totalTasks++;
if (proc->state == 'R')
this->runningTasks++;
diff --git a/freebsd/FreeBSDProcessList.h b/freebsd/FreeBSDProcessList.h
index af343fb..7c1b7ad 100644
--- a/freebsd/FreeBSDProcessList.h
+++ b/freebsd/FreeBSDProcessList.h
@@ -10,6 +10,8 @@ in the source distribution for its full text.
*/
+#include "zfs/ZfsArcStats.h"
+
#include <kvm.h>
#include <sys/param.h>
#include <sys/jail.h>
@@ -34,14 +36,12 @@ 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;
+ ZfsArcStats zfs;
CPUData* cpus;
diff --git a/freebsd/Platform.c b/freebsd/Platform.c
index 5dd6ca4..e6acebd 100644
--- a/freebsd/Platform.c
+++ b/freebsd/Platform.c
@@ -15,6 +15,8 @@ in the source distribution for its full text.
#include "UptimeMeter.h"
#include "ClockMeter.h"
#include "HostnameMeter.h"
+#include "zfs/ZfsArcMeter.h"
+#include "zfs/ZfsCompressedArcMeter.h"
#include "FreeBSDProcess.h"
#include "FreeBSDProcessList.h"
@@ -104,6 +106,8 @@ MeterClass* Platform_meterTypes[] = {
&LeftCPUs2Meter_class,
&RightCPUs2Meter_class,
&BlankMeter_class,
+ &ZfsArcMeter_class,
+ &ZfsCompressedArcMeter_class,
NULL
};
@@ -178,6 +182,9 @@ double Platform_setCPUValues(Meter* this, int cpu) {
percent = CLAMP(percent, 0.0, 100.0);
if (isnan(percent)) percent = 0.0;
+
+ v[CPU_METER_FREQUENCY] = -1;
+
return percent;
}
@@ -197,6 +204,18 @@ void Platform_setSwapValues(Meter* this) {
this->values[0] = pl->usedSwap;
}
+void Platform_setZfsArcValues(Meter* this) {
+ FreeBSDProcessList* fpl = (FreeBSDProcessList*) this->pl;
+
+ ZfsArcMeter_readStats(this, &(fpl->zfs));
+}
+
+void Platform_setZfsCompressedArcValues(Meter* this) {
+ FreeBSDProcessList* fpl = (FreeBSDProcessList*) this->pl;
+
+ ZfsCompressedArcMeter_readStats(this, &(fpl->zfs));
+}
+
void Platform_setTasksValues(Meter* this) {
// TODO
}
diff --git a/freebsd/Platform.h b/freebsd/Platform.h
index 1735e7e..0268f2c 100644
--- a/freebsd/Platform.h
+++ b/freebsd/Platform.h
@@ -44,6 +44,10 @@ void Platform_setMemoryValues(Meter* this);
void Platform_setSwapValues(Meter* this);
+void Platform_setZfsArcValues(Meter* this);
+
+void Platform_setZfsCompressedArcValues(Meter* this);
+
void Platform_setTasksValues(Meter* this);
char* Platform_getProcessEnv(pid_t pid);

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