You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.5 KiB
86 lines
2.5 KiB
/* |
|
htop - CPUMeter.c |
|
(C) 2004-2006 Hisham H. Muhammad |
|
Released under the GNU GPL, see the COPYING file |
|
in the source distribution for its full text. |
|
*/ |
|
|
|
#include "CPUMeter.h" |
|
#include "Meter.h" |
|
|
|
#include "ProcessList.h" |
|
|
|
#include <stdlib.h> |
|
#include <curses.h> |
|
#include <string.h> |
|
#include <math.h> |
|
|
|
#include "debug.h" |
|
#include <assert.h> |
|
|
|
/*{ |
|
|
|
typedef struct CPUMeter_ CPUMeter; |
|
|
|
struct CPUMeter_ { |
|
Meter super; |
|
ProcessList* pl; |
|
int processor; |
|
}; |
|
|
|
}*/ |
|
|
|
#ifndef MIN |
|
#define MIN(a,b) ((a)<(b)?(a):(b)) |
|
#endif |
|
#ifndef MAX |
|
#define MAX(a,b) ((a)>(b)?(a):(b)) |
|
#endif |
|
|
|
CPUMeter* CPUMeter_new(ProcessList* pl, int processor) { |
|
CPUMeter* this = malloc(sizeof(CPUMeter)); |
|
char* caption; |
|
if (pl->processorCount == 1 || processor == 0) { |
|
caption = String_copy("CPU"); |
|
} else { |
|
caption = (char*) malloc(4); |
|
sprintf(caption, "%-3d", processor); |
|
} |
|
Meter_init((Meter*)this, NULL, caption, 3); |
|
((Meter*)this)->name = malloc(20); |
|
sprintf(((Meter*)this)->name, "CPU(%d)", processor); |
|
((Meter*)this)->attributes[0] = CPU_NICE; |
|
((Meter*)this)->attributes[1] = CPU_NORMAL; |
|
((Meter*)this)->attributes[2] = CPU_KERNEL; |
|
((Meter*)this)->setValues = CPUMeter_setValues; |
|
((Object*)this)->display = CPUMeter_display; |
|
((Meter*)this)->total = 1.0; |
|
Meter_setMode((Meter*)this, BAR); |
|
this->processor = processor; |
|
this->pl = pl; |
|
return this; |
|
} |
|
|
|
void CPUMeter_setValues(Meter* cast) { |
|
CPUMeter* this = (CPUMeter*)cast; |
|
cast->values[0] = this->pl->nicePeriod[this->processor] / (double)this->pl->totalPeriod[this->processor]; |
|
cast->values[1] = this->pl->userPeriod[this->processor] / (double)this->pl->totalPeriod[this->processor]; |
|
cast->values[2] = this->pl->systemPeriod[this->processor] / (double)this->pl->totalPeriod[this->processor]; |
|
double cpu = MIN(100.0, MAX(0.0, (cast->values[0]+cast->values[1]+cast->values[2])*100.0 )); |
|
snprintf(cast->displayBuffer.c, 7, "%5.1f%%", cpu ); |
|
} |
|
|
|
void CPUMeter_display(Object* cast, RichString* out) { |
|
char buffer[50]; |
|
Meter* this = (Meter*)cast; |
|
RichString_prune(out); |
|
sprintf(buffer, "%5.1f%% ", this->values[1] * 100.0); |
|
RichString_append(out, CRT_colors[METER_TEXT], ":"); |
|
RichString_append(out, CRT_colors[CPU_NORMAL], buffer); |
|
sprintf(buffer, "%5.1f%% ", this->values[2] * 100.0); |
|
RichString_append(out, CRT_colors[METER_TEXT], "sys:"); |
|
RichString_append(out, CRT_colors[CPU_KERNEL], buffer); |
|
sprintf(buffer, "%5.1f%% ", this->values[0] * 100.0); |
|
RichString_append(out, CRT_colors[METER_TEXT], "low:"); |
|
RichString_append(out, CRT_colors[CPU_NICE], buffer); |
|
}
|
|
|