mirror of https://github.com/xzeldon/htop.git
IOMeters: rework initial display
Show a non highlighted string at the start of htop, not the failure
text.
Also the original fix only handled the text mode, not the bar mode.
Improves: 2977414d
("Discard stale information from DiskIO and NetworkIO meters")
Related: #860
This commit is contained in:
parent
3cfdf66d9a
commit
63fafb4844
|
@ -12,6 +12,7 @@ in the source distribution for its full text.
|
||||||
|
|
||||||
#include "CRT.h"
|
#include "CRT.h"
|
||||||
#include "Macros.h"
|
#include "Macros.h"
|
||||||
|
#include "Meter.h"
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
#include "ProcessList.h"
|
#include "ProcessList.h"
|
||||||
|
@ -25,7 +26,7 @@ static const int DiskIOMeter_attributes[] = {
|
||||||
METER_VALUE_IOWRITE,
|
METER_VALUE_IOWRITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool hasData = false;
|
static MeterRateStatus status = RATESTATUS_INIT;
|
||||||
static uint32_t cached_read_diff;
|
static uint32_t cached_read_diff;
|
||||||
static uint32_t cached_write_diff;
|
static uint32_t cached_write_diff;
|
||||||
static double cached_utilisation_diff;
|
static double cached_utilisation_diff;
|
||||||
|
@ -36,20 +37,27 @@ static void DiskIOMeter_updateValues(Meter* this) {
|
||||||
static uint64_t cached_last_update;
|
static uint64_t cached_last_update;
|
||||||
uint64_t passedTimeInMs = pl->realtimeMs - cached_last_update;
|
uint64_t passedTimeInMs = pl->realtimeMs - cached_last_update;
|
||||||
|
|
||||||
/* update only every 500ms */
|
/* update only every 500ms to have a sane span for rate calculation */
|
||||||
if (passedTimeInMs > 500) {
|
if (passedTimeInMs > 500) {
|
||||||
static uint64_t cached_read_total;
|
static uint64_t cached_read_total;
|
||||||
static uint64_t cached_write_total;
|
static uint64_t cached_write_total;
|
||||||
static uint64_t cached_msTimeSpend_total;
|
static uint64_t cached_msTimeSpend_total;
|
||||||
uint64_t diff;
|
uint64_t diff;
|
||||||
|
|
||||||
|
DiskIOData data;
|
||||||
|
if (!Platform_getDiskIO(&data)) {
|
||||||
|
status = RATESTATUS_NODATA;
|
||||||
|
} else if (cached_last_update == 0) {
|
||||||
|
status = RATESTATUS_INIT;
|
||||||
|
} else if (passedTimeInMs > 30000) {
|
||||||
|
status = RATESTATUS_STALE;
|
||||||
|
} else {
|
||||||
|
status = RATESTATUS_DATA;
|
||||||
|
}
|
||||||
|
|
||||||
cached_last_update = pl->realtimeMs;
|
cached_last_update = pl->realtimeMs;
|
||||||
|
|
||||||
DiskIOData data;
|
if (status == RATESTATUS_NODATA) {
|
||||||
|
|
||||||
hasData = Platform_getDiskIO(&data);
|
|
||||||
if (!hasData) {
|
|
||||||
this->values[0] = 0;
|
|
||||||
xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "no data");
|
xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "no data");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -81,10 +89,13 @@ static void DiskIOMeter_updateValues(Meter* this) {
|
||||||
cached_msTimeSpend_total = data.totalMsTimeSpend;
|
cached_msTimeSpend_total = data.totalMsTimeSpend;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (passedTimeInMs > 30000) {
|
if (status == RATESTATUS_INIT) {
|
||||||
// Triggers for the first initialization and
|
xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "init");
|
||||||
// when there was a long time we did not collect updates
|
return;
|
||||||
hasData = false;
|
}
|
||||||
|
if (status == RATESTATUS_STALE) {
|
||||||
|
xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "stale");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->values[0] = cached_utilisation_diff;
|
this->values[0] = cached_utilisation_diff;
|
||||||
|
@ -97,9 +108,18 @@ static void DiskIOMeter_updateValues(Meter* this) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DiskIOMeter_display(ATTR_UNUSED const Object* cast, RichString* out) {
|
static void DiskIOMeter_display(ATTR_UNUSED const Object* cast, RichString* out) {
|
||||||
if (!hasData) {
|
switch (status) {
|
||||||
|
case RATESTATUS_NODATA:
|
||||||
RichString_writeAscii(out, CRT_colors[METER_VALUE_ERROR], "no data");
|
RichString_writeAscii(out, CRT_colors[METER_VALUE_ERROR], "no data");
|
||||||
return;
|
return;
|
||||||
|
case RATESTATUS_INIT:
|
||||||
|
RichString_writeAscii(out, CRT_colors[METER_VALUE], "initializing...");
|
||||||
|
return;
|
||||||
|
case RATESTATUS_STALE:
|
||||||
|
RichString_writeAscii(out, CRT_colors[METER_VALUE_WARN], "stale data");
|
||||||
|
return;
|
||||||
|
case RATESTATUS_DATA:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
char buffer[16];
|
char buffer[16];
|
||||||
|
|
7
Meter.h
7
Meter.h
|
@ -134,6 +134,13 @@ typedef enum {
|
||||||
LAST_METERMODE
|
LAST_METERMODE
|
||||||
} MeterModeId;
|
} MeterModeId;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
RATESTATUS_DATA,
|
||||||
|
RATESTATUS_INIT,
|
||||||
|
RATESTATUS_NODATA,
|
||||||
|
RATESTATUS_STALE
|
||||||
|
} MeterRateStatus;
|
||||||
|
|
||||||
extern const MeterClass Meter_class;
|
extern const MeterClass Meter_class;
|
||||||
|
|
||||||
Meter* Meter_new(const ProcessList* pl, unsigned int param, const MeterClass* type);
|
Meter* Meter_new(const ProcessList* pl, unsigned int param, const MeterClass* type);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "CRT.h"
|
#include "CRT.h"
|
||||||
#include "Macros.h"
|
#include "Macros.h"
|
||||||
|
#include "Meter.h"
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
#include "Process.h"
|
#include "Process.h"
|
||||||
|
@ -18,8 +19,7 @@ static const int NetworkIOMeter_attributes[] = {
|
||||||
METER_VALUE_IOWRITE,
|
METER_VALUE_IOWRITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool hasData = false;
|
static MeterRateStatus status = RATESTATUS_INIT;
|
||||||
|
|
||||||
static uint32_t cached_rxb_diff;
|
static uint32_t cached_rxb_diff;
|
||||||
static uint32_t cached_rxp_diff;
|
static uint32_t cached_rxp_diff;
|
||||||
static uint32_t cached_txb_diff;
|
static uint32_t cached_txb_diff;
|
||||||
|
@ -31,7 +31,7 @@ static void NetworkIOMeter_updateValues(Meter* this) {
|
||||||
|
|
||||||
uint64_t passedTimeInMs = pl->realtimeMs - cached_last_update;
|
uint64_t passedTimeInMs = pl->realtimeMs - cached_last_update;
|
||||||
|
|
||||||
/* update only every 500ms */
|
/* update only every 500ms to have a sane span for rate calculation */
|
||||||
if (passedTimeInMs > 500) {
|
if (passedTimeInMs > 500) {
|
||||||
static uint64_t cached_rxb_total;
|
static uint64_t cached_rxb_total;
|
||||||
static uint64_t cached_rxp_total;
|
static uint64_t cached_rxp_total;
|
||||||
|
@ -39,11 +39,20 @@ static void NetworkIOMeter_updateValues(Meter* this) {
|
||||||
static uint64_t cached_txp_total;
|
static uint64_t cached_txp_total;
|
||||||
uint64_t diff;
|
uint64_t diff;
|
||||||
|
|
||||||
|
NetworkIOData data;
|
||||||
|
if (!Platform_getNetworkIO(&data)) {
|
||||||
|
status = RATESTATUS_NODATA;
|
||||||
|
} else if (cached_last_update == 0) {
|
||||||
|
status = RATESTATUS_INIT;
|
||||||
|
} else if (passedTimeInMs > 30000) {
|
||||||
|
status = RATESTATUS_STALE;
|
||||||
|
} else {
|
||||||
|
status = RATESTATUS_DATA;
|
||||||
|
}
|
||||||
|
|
||||||
cached_last_update = pl->realtimeMs;
|
cached_last_update = pl->realtimeMs;
|
||||||
|
|
||||||
NetworkIOData data;
|
if (status == RATESTATUS_NODATA) {
|
||||||
hasData = Platform_getNetworkIO(&data);
|
|
||||||
if (!hasData) {
|
|
||||||
xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "no data");
|
xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "no data");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -85,10 +94,13 @@ static void NetworkIOMeter_updateValues(Meter* this) {
|
||||||
cached_txp_total = data.packetsTransmitted;
|
cached_txp_total = data.packetsTransmitted;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (passedTimeInMs > 30000) {
|
if (status == RATESTATUS_INIT) {
|
||||||
// Triggers for the first initialization and
|
xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "init");
|
||||||
// when there was a long time we did not collect updates
|
return;
|
||||||
hasData = false;
|
}
|
||||||
|
if (status == RATESTATUS_STALE) {
|
||||||
|
xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "stale");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->values[0] = cached_rxb_diff;
|
this->values[0] = cached_rxb_diff;
|
||||||
|
@ -104,9 +116,18 @@ static void NetworkIOMeter_updateValues(Meter* this) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NetworkIOMeter_display(ATTR_UNUSED const Object* cast, RichString* out) {
|
static void NetworkIOMeter_display(ATTR_UNUSED const Object* cast, RichString* out) {
|
||||||
if (!hasData) {
|
switch (status) {
|
||||||
|
case RATESTATUS_NODATA:
|
||||||
RichString_writeAscii(out, CRT_colors[METER_VALUE_ERROR], "no data");
|
RichString_writeAscii(out, CRT_colors[METER_VALUE_ERROR], "no data");
|
||||||
return;
|
return;
|
||||||
|
case RATESTATUS_INIT:
|
||||||
|
RichString_writeAscii(out, CRT_colors[METER_VALUE], "initializing...");
|
||||||
|
return;
|
||||||
|
case RATESTATUS_STALE:
|
||||||
|
RichString_writeAscii(out, CRT_colors[METER_VALUE_WARN], "stale data");
|
||||||
|
return;
|
||||||
|
case RATESTATUS_DATA:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
|
|
Loading…
Reference in New Issue