diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:58:07 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:58:07 +0000 |
commit | 10eea2ab1bae2a8ec159d81c0446fd8061b33e2b (patch) | |
tree | e8270dd60ec096bee8157dbadf029e15ed584592 /LoadAverageMeter.c | |
parent | Initial commit. (diff) | |
download | htop-10eea2ab1bae2a8ec159d81c0446fd8061b33e2b.tar.xz htop-10eea2ab1bae2a8ec159d81c0446fd8061b33e2b.zip |
Adding upstream version 3.3.0.upstream/3.3.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'LoadAverageMeter.c')
-rw-r--r-- | LoadAverageMeter.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/LoadAverageMeter.c b/LoadAverageMeter.c new file mode 100644 index 0000000..30c58bb --- /dev/null +++ b/LoadAverageMeter.c @@ -0,0 +1,136 @@ +/* +htop - LoadAverageMeter.c +(C) 2004-2011 Hisham H. Muhammad +Released under the GNU GPLv2+, see the COPYING file +in the source distribution for its full text. +*/ + +#include "config.h" // IWYU pragma: keep + +#include "LoadAverageMeter.h" + +#include "CRT.h" +#include "Machine.h" +#include "Object.h" +#include "Platform.h" +#include "RichString.h" +#include "XUtils.h" + + +static const int LoadAverageMeter_attributes[] = { + LOAD_AVERAGE_ONE, + LOAD_AVERAGE_FIVE, + LOAD_AVERAGE_FIFTEEN +}; + +static const int LoadMeter_attributes[] = { + LOAD +}; + +static const int OK_attributes[] = { + METER_VALUE_OK +}; + +static const int Medium_attributes[] = { + METER_VALUE_WARN +}; + +static const int High_attributes[] = { + METER_VALUE_ERROR +}; + +static void LoadAverageMeter_updateValues(Meter* this) { + Platform_getLoadAverage(&this->values[0], &this->values[1], &this->values[2]); + + // only show bar for 1min value + this->curItems = 1; + + // change bar color and total based on value + if (this->values[0] < 1.0) { + this->curAttributes = OK_attributes; + this->total = 1.0; + } else if (this->values[0] < this->host->activeCPUs) { + this->curAttributes = Medium_attributes; + this->total = this->host->activeCPUs; + } else { + this->curAttributes = High_attributes; + this->total = 2 * this->host->activeCPUs; + } + + xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "%.2f/%.2f/%.2f", this->values[0], this->values[1], this->values[2]); +} + +static void LoadAverageMeter_display(const Object* cast, RichString* out) { + const Meter* this = (const Meter*)cast; + char buffer[20]; + int len; + + len = xSnprintf(buffer, sizeof(buffer), "%.2f ", this->values[0]); + RichString_appendnAscii(out, CRT_colors[LOAD_AVERAGE_ONE], buffer, len); + len = xSnprintf(buffer, sizeof(buffer), "%.2f ", this->values[1]); + RichString_appendnAscii(out, CRT_colors[LOAD_AVERAGE_FIVE], buffer, len); + len = xSnprintf(buffer, sizeof(buffer), "%.2f ", this->values[2]); + RichString_appendnAscii(out, CRT_colors[LOAD_AVERAGE_FIFTEEN], buffer, len); +} + +static void LoadMeter_updateValues(Meter* this) { + double five, fifteen; + Platform_getLoadAverage(&this->values[0], &five, &fifteen); + + // change bar color and total based on value + if (this->values[0] < 1.0) { + this->curAttributes = OK_attributes; + this->total = 1.0; + } else if (this->values[0] < this->host->activeCPUs) { + this->curAttributes = Medium_attributes; + this->total = this->host->activeCPUs; + } else { + this->curAttributes = High_attributes; + this->total = 2 * this->host->activeCPUs; + } + + xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "%.2f", this->values[0]); +} + +static void LoadMeter_display(const Object* cast, RichString* out) { + const Meter* this = (const Meter*)cast; + char buffer[20]; + int len; + + len = xSnprintf(buffer, sizeof(buffer), "%.2f ", this->values[0]); + RichString_appendnAscii(out, CRT_colors[LOAD], buffer, len); +} + +const MeterClass LoadAverageMeter_class = { + .super = { + .extends = Class(Meter), + .delete = Meter_delete, + .display = LoadAverageMeter_display, + }, + .updateValues = LoadAverageMeter_updateValues, + .defaultMode = TEXT_METERMODE, + .maxItems = 3, + .total = 100.0, + .attributes = LoadAverageMeter_attributes, + .name = "LoadAverage", + .uiName = "Load average", + .description = "Load averages: 1 minute, 5 minutes, 15 minutes", + .caption = "Load average: " +}; + +const MeterClass LoadMeter_class = { + .super = { + .extends = Class(Meter), + .delete = Meter_delete, + .display = LoadMeter_display, + }, + .updateValues = LoadMeter_updateValues, + .defaultMode = TEXT_METERMODE, + .maxItems = 1, + .total = 100.0, + .attributes = LoadMeter_attributes, + .name = "Load", + .uiName = "Load", + .description = "Load: average of ready processes in the last minute", + .caption = "Load: " +}; |