From 283707c5e5bc436b78ea23bf5500cb6b16a01148 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 11 Apr 2016 13:00:27 +0200 Subject: Imported Upstream version 0.9 --- CPUMeter.c | 86 +++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 34 deletions(-) (limited to 'CPUMeter.c') diff --git a/CPUMeter.c b/CPUMeter.c index 7325bff..a1144ea 100644 --- a/CPUMeter.c +++ b/CPUMeter.c @@ -1,6 +1,6 @@ /* htop - CPUMeter.c -(C) 2004-2006 Hisham H. Muhammad +(C) 2004-2010 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ @@ -19,7 +19,7 @@ in the source distribution for its full text. #include int CPUMeter_attributes[] = { - CPU_NICE, CPU_NORMAL, CPU_KERNEL, CPU_IRQ, CPU_SOFTIRQ, CPU_IOWAIT + CPU_NICE, CPU_NORMAL, CPU_KERNEL, CPU_IRQ, CPU_SOFTIRQ, CPU_IOWAIT, CPU_STEAL, CPU_GUEST }; #ifndef MIN @@ -30,10 +30,10 @@ int CPUMeter_attributes[] = { #endif static void CPUMeter_init(Meter* this) { - int processor = this->param; - if (this->pl->processorCount > 1) { + int cpu = this->param; + if (this->pl->cpuCount > 1) { char caption[10]; - sprintf(caption, "%-3d", processor); + sprintf(caption, "%-3d", cpu); Meter_setCaption(this, caption); } if (this->param == 0) @@ -42,36 +42,41 @@ static void CPUMeter_init(Meter* this) { static void CPUMeter_setValues(Meter* this, char* buffer, int size) { ProcessList* pl = this->pl; - int processor = this->param; - if (processor > this->pl->processorCount) { + int cpu = this->param; + if (cpu > this->pl->cpuCount) { snprintf(buffer, size, "absent"); return; } - double total = (double) pl->totalPeriod[processor]; - double cpu; - this->values[0] = pl->nicePeriod[processor] / total * 100.0; - this->values[1] = pl->userPeriod[processor] / total * 100.0; + CPUData* cpuData = &(pl->cpus[cpu]); + double total = (double) ( cpuData->totalPeriod == 0 ? 1 : cpuData->totalPeriod); + double percent; + this->values[0] = cpuData->nicePeriod / total * 100.0; + this->values[1] = cpuData->userPeriod / total * 100.0; if (pl->detailedCPUTime) { - this->values[2] = pl->systemPeriod[processor] / total * 100.0; - this->values[3] = pl->irqPeriod[processor] / total * 100.0; - this->values[4] = pl->softIrqPeriod[processor] / total * 100.0; - this->values[5] = pl->ioWaitPeriod[processor] / total * 100.0; - this->type->items = 6; - cpu = MIN(100.0, MAX(0.0, (this->values[0]+this->values[1]+this->values[2]+ + this->values[2] = cpuData->systemPeriod / total * 100.0; + this->values[3] = cpuData->irqPeriod / total * 100.0; + this->values[4] = cpuData->softIrqPeriod / total * 100.0; + this->values[5] = cpuData->ioWaitPeriod / total * 100.0; + this->values[6] = cpuData->stealPeriod / total * 100.0; + this->values[7] = cpuData->guestPeriod / total * 100.0; + this->type->items = 8; + percent = MIN(100.0, MAX(0.0, (this->values[0]+this->values[1]+this->values[2]+ this->values[3]+this->values[4]))); } else { - this->values[2] = pl->systemAllPeriod[processor] / total * 100.0; - this->type->items = 3; - cpu = MIN(100.0, MAX(0.0, (this->values[0]+this->values[1]+this->values[2]))); + this->values[2] = cpuData->systemAllPeriod / total * 100.0; + this->values[3] = (cpuData->stealPeriod + cpuData->guestPeriod) / total * 100.0; + this->type->items = 4; + percent = MIN(100.0, MAX(0.0, (this->values[0]+this->values[1]+this->values[2]+this->values[3]))); } - snprintf(buffer, size, "%5.1f%%", cpu ); + if (isnan(percent)) percent = 0.0; + snprintf(buffer, size, "%5.1f%%", percent); } static void CPUMeter_display(Object* cast, RichString* out) { char buffer[50]; Meter* this = (Meter*)cast; - RichString_init(out); - if (this->param > this->pl->processorCount) { + RichString_prune(out); + if (this->param > this->pl->cpuCount) { RichString_append(out, CRT_colors[METER_TEXT], "absent"); return; } @@ -94,6 +99,14 @@ static void CPUMeter_display(Object* cast, RichString* out) { sprintf(buffer, "%5.1f%% ", this->values[5]); RichString_append(out, CRT_colors[METER_TEXT], "wa:"); RichString_append(out, CRT_colors[CPU_IOWAIT], buffer); + sprintf(buffer, "%5.1f%% ", this->values[6]); + RichString_append(out, CRT_colors[METER_TEXT], "st:"); + RichString_append(out, CRT_colors[CPU_STEAL], buffer); + if (this->values[7]) { + sprintf(buffer, "%5.1f%% ", this->values[7]); + RichString_append(out, CRT_colors[METER_TEXT], "gu:"); + RichString_append(out, CRT_colors[CPU_GUEST], buffer); + } } else { sprintf(buffer, "%5.1f%% ", this->values[2]); RichString_append(out, CRT_colors[METER_TEXT], "sys:"); @@ -101,37 +114,42 @@ static void CPUMeter_display(Object* cast, RichString* out) { sprintf(buffer, "%5.1f%% ", this->values[0]); RichString_append(out, CRT_colors[METER_TEXT], "low:"); RichString_append(out, CRT_colors[CPU_NICE], buffer); + if (this->values[3]) { + sprintf(buffer, "%5.1f%% ", this->values[3]); + RichString_append(out, CRT_colors[METER_TEXT], "vir:"); + RichString_append(out, CRT_colors[CPU_GUEST], buffer); + } } } static void AllCPUsMeter_init(Meter* this) { - int processors = this->pl->processorCount; - this->drawBuffer = malloc(sizeof(Meter*) * processors); + int cpus = this->pl->cpuCount; + this->drawBuffer = malloc(sizeof(Meter*) * cpus); Meter** meters = (Meter**) this->drawBuffer; - for (int i = 0; i < processors; i++) + for (int i = 0; i < cpus; i++) meters[i] = Meter_new(this->pl, i+1, &CPUMeter); - this->h = processors; + this->h = cpus; this->mode = BAR_METERMODE; } static void AllCPUsMeter_done(Meter* this) { - int processors = this->pl->processorCount; + int cpus = this->pl->cpuCount; Meter** meters = (Meter**) this->drawBuffer; - for (int i = 0; i < processors; i++) + for (int i = 0; i < cpus; i++) Meter_delete((Object*)meters[i]); } static void AllCPUsMeter_setMode(Meter* this, int mode) { this->mode = mode; - int processors = this->pl->processorCount; + int cpus = this->pl->cpuCount; int h = Meter_modes[this->mode]->h; - this->h = h * processors; + this->h = h * cpus; } static void AllCPUsMeter_draw(Meter* this, int x, int y, int w) { - int processors = this->pl->processorCount; + int cpus = this->pl->cpuCount; Meter** meters = (Meter**) this->drawBuffer; - for (int i = 0; i < processors; i++) { + for (int i = 0; i < cpus; i++) { Meter_setMode(meters[i], this->mode); meters[i]->draw(meters[i], x, y, w); y += meters[i]->h; @@ -142,7 +160,7 @@ MeterType CPUMeter = { .setValues = CPUMeter_setValues, .display = CPUMeter_display, .mode = BAR_METERMODE, - .items = 6, + .items = 8, .total = 100.0, .attributes = CPUMeter_attributes, .name = "CPU", -- cgit v1.2.3