summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ClockMeter.c5
-rw-r--r--DateMeter.c5
-rw-r--r--DiskIOMeter.c10
-rw-r--r--Meter.c8
-rw-r--r--NetworkIOMeter.c8
-rw-r--r--ProcessList.h3
-rw-r--r--linux/LinuxProcessList.c14
7 files changed, 29 insertions, 24 deletions
diff --git a/ClockMeter.c b/ClockMeter.c
index 410c7e8a..de47bdcb 100644
--- a/ClockMeter.c
+++ b/ClockMeter.c
@@ -20,9 +20,10 @@ static const int ClockMeter_attributes[] = {
};
static void ClockMeter_updateValues(Meter* this) {
- time_t t = time(NULL);
+ const ProcessList* pl = this->pl;
+
struct tm result;
- const struct tm* lt = localtime_r(&t, &result);
+ const struct tm* lt = localtime_r(&pl->timestamp.tv_sec, &result);
this->values[0] = lt->tm_hour * 60 + lt->tm_min;
strftime(this->txtBuffer, sizeof(this->txtBuffer), "%H:%M:%S", lt);
}
diff --git a/DateMeter.c b/DateMeter.c
index ac653b62..e7fe1a67 100644
--- a/DateMeter.c
+++ b/DateMeter.c
@@ -20,9 +20,10 @@ static const int DateMeter_attributes[] = {
};
static void DateMeter_updateValues(Meter* this) {
- time_t t = time(NULL);
+ const ProcessList* pl = this->pl;
+
struct tm result;
- const struct tm* lt = localtime_r(&t, &result);
+ const struct tm* lt = localtime_r(&pl->timestamp.tv_sec, &result);
this->values[0] = lt->tm_yday;
int year = lt->tm_year + 1900;
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
diff --git a/DiskIOMeter.c b/DiskIOMeter.c
index dde007ed..c1b35690 100644
--- a/DiskIOMeter.c
+++ b/DiskIOMeter.c
@@ -31,12 +31,10 @@ static uint32_t cached_write_diff;
static double cached_utilisation_diff;
static void DiskIOMeter_updateValues(Meter* this) {
- static uint64_t cached_last_update;
+ const ProcessList* pl = this->pl;
- struct timeval tv;
- gettimeofday(&tv, NULL);
- uint64_t timeInMilliSeconds = (uint64_t)tv.tv_sec * 1000 + (uint64_t)tv.tv_usec / 1000;
- uint64_t passedTimeInMs = timeInMilliSeconds - cached_last_update;
+ static uint64_t cached_last_update;
+ uint64_t passedTimeInMs = pl->timestampMs - cached_last_update;
/* update only every 500ms */
if (passedTimeInMs > 500) {
@@ -45,7 +43,7 @@ static void DiskIOMeter_updateValues(Meter* this) {
static uint64_t cached_msTimeSpend_total;
uint64_t diff;
- cached_last_update = timeInMilliSeconds;
+ cached_last_update = pl->timestampMs;
DiskIOData data;
diff --git a/Meter.c b/Meter.c
index 6aa9f08e..b60b6933 100644
--- a/Meter.c
+++ b/Meter.c
@@ -18,6 +18,7 @@ in the source distribution for its full text.
#include "CRT.h"
#include "Macros.h"
#include "Object.h"
+#include "Platform.h"
#include "ProvideCurses.h"
#include "RichString.h"
#include "Settings.h"
@@ -286,6 +287,7 @@ static const char* const GraphMeterMode_dotsAscii[] = {
};
static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
+ const ProcessList* pl = this->pl;
if (!this->drawData) {
this->drawData = xCalloc(1, sizeof(GraphData));
@@ -312,12 +314,10 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
x += captionLen;
w -= captionLen;
- struct timeval now;
- gettimeofday(&now, NULL);
- if (!timercmp(&now, &(data->time), <)) {
+ if (!timercmp(&pl->timestamp, &(data->time), <)) {
int globalDelay = this->pl->settings->delay;
struct timeval delay = { .tv_sec = globalDelay / 10, .tv_usec = (globalDelay - ((globalDelay / 10) * 10)) * 100000 };
- timeradd(&now, &delay, &(data->time));
+ timeradd(&pl->timestamp, &delay, &(data->time));
for (int i = 0; i < nValues - 1; i++)
data->values[i] = data->values[i + 1];
diff --git a/NetworkIOMeter.c b/NetworkIOMeter.c
index c0e1b06f..bfcb3c0e 100644
--- a/NetworkIOMeter.c
+++ b/NetworkIOMeter.c
@@ -25,12 +25,10 @@ static uint32_t cached_txb_diff;
static uint32_t cached_txp_diff;
static void NetworkIOMeter_updateValues(Meter* this) {
+ const ProcessList* pl = this->pl;
static uint64_t cached_last_update = 0;
- struct timeval tv;
- gettimeofday(&tv, NULL);
- uint64_t timeInMilliSeconds = (uint64_t)tv.tv_sec * 1000 + (uint64_t)tv.tv_usec / 1000;
- uint64_t passedTimeInMs = timeInMilliSeconds - cached_last_update;
+ uint64_t passedTimeInMs = pl->timestampMs - cached_last_update;
/* update only every 500ms */
if (passedTimeInMs > 500) {
@@ -40,7 +38,7 @@ static void NetworkIOMeter_updateValues(Meter* this) {
static uint64_t cached_txp_total;
uint64_t diff;
- cached_last_update = timeInMilliSeconds;
+ cached_last_update = pl->timestampMs;
NetworkIOData data;
hasData = Platform_getNetworkIO(&data);
diff --git a/ProcessList.h b/ProcessList.h
index 3d9b8ff2..46944dbd 100644
--- a/ProcessList.h
+++ b/ProcessList.h
@@ -48,6 +48,9 @@ typedef struct ProcessList_ {
Hashtable* displayTreeSet;
Hashtable* draftingTreeSet;
+ struct timeval timestamp; /* time of the current sample */
+ uint64_t timestampMs; /* current time in milliseconds */
+
Panel* panel;
int following;
uid_t userId;
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c
index b12a415b..c6fd205a 100644
--- a/linux/LinuxProcessList.c
+++ b/linux/LinuxProcessList.c
@@ -189,6 +189,13 @@ static void LinuxProcessList_updateCPUcount(ProcessList* super, FILE* stream) {
}
}
+static void LinuxProcessList_updateTime(LinuxProcessList* this) {
+ ProcessList* pl = &(this->super);
+
+ gettimeofday(&pl->timestamp, NULL);
+ pl->timestampMs = (uint64_t)&pl->timestamp.tv_sec * 1000 + (uint64_t)pl->timestamp.tv_usec / 1000;
+}
+
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, uid_t userId) {
LinuxProcessList* this = xCalloc(1, sizeof(LinuxProcessList));
ProcessList* pl = &(this->super);
@@ -1968,6 +1975,7 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
LinuxProcessList* this = (LinuxProcessList*) super;
const Settings* settings = super->settings;
+ LinuxProcessList_updateTime(this);
LinuxProcessList_scanMemoryInfo(super);
LinuxProcessList_scanHugePages(this);
LinuxProcessList_scanZfsArcstats(this);
@@ -1989,10 +1997,6 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
return;
}
- struct timeval tv;
- gettimeofday(&tv, NULL);
- unsigned long long now = tv.tv_sec * 1000ULL + tv.tv_usec / 1000ULL;
-
/* PROCDIR is an absolute path */
assert(PROCDIR[0] == '/');
#ifdef HAVE_OPENAT
@@ -2001,5 +2005,5 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
openat_arg_t rootFd = "";
#endif
- LinuxProcessList_recurseProcTree(this, rootFd, PROCDIR, NULL, period, now);
+ LinuxProcessList_recurseProcTree(this, rootFd, PROCDIR, NULL, period, super->timestampMs);
}