1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
//
// Copyright (c) 1994, 1995 by Mike Romberg ( romberg@fsl.noaa.gov )
// Copyright (c) 1995, 1996, 1997-2002 by Brian Grayson (bgrayson@netbsd.org)
//
// Most of this code was written by Werner Fink <werner@suse.de>.
// Only small changes were made on my part (M.R.)
// And the near-trivial port to NetBSD was done by Brian Grayson
//
// This file may be distributed under terms of the GPL or of the BSD
// license, whichever you choose. The full license notices are
// contained in the files COPYING.GPL and COPYING.BSD, which you
// should have received. If not, contact one of the xosview
// authors for a copy.
//
#include "loadmeter.h"
#include "kernel.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
LoadMeter::LoadMeter( XOSView *parent )
: FieldMeterGraph( parent, 2, "LOAD", "PROCS/MIN", 1, 1, 0 ) {
total_ = -1.0;
}
LoadMeter::~LoadMeter( void ) {
}
void LoadMeter::checkResources( void ) {
FieldMeterGraph::checkResources();
procloadcol_ = parent_->allocColor( parent_->getResource("loadProcColor") );
warnloadcol_ = parent_->allocColor( parent_->getResource("loadWarnColor") );
critloadcol_ = parent_->allocColor( parent_->getResource("loadCritColor") );
setfieldcolor( 0, procloadcol_ );
setfieldcolor( 1, parent_->getResource("loadIdleColor") );
priority_ = atoi( parent_->getResource("loadPriority") );
dodecay_ = parent_->isResourceTrue("loadDecay");
useGraph_ = parent_->isResourceTrue("loadGraph");
SetUsedFormat( parent_->getResource("loadUsedFormat") );
do_cpu_speed_ = parent_->isResourceTrue("loadCpuSpeed");
const char *warn = parent_->getResource("loadWarnThreshold");
if (strncmp(warn, "auto", 2) == 0)
warnThreshold_ = BSDCountCpus();
else
warnThreshold_ = atoi(warn);
const char *crit = parent_->getResource("loadCritThreshold");
if (strncmp(crit, "auto", 2) == 0)
critThreshold_ = warnThreshold_ * 4;
else
critThreshold_ = atoi(crit);
alarmstate_ = lastalarmstate_ = 0;
if (dodecay_) {
// Warning: Since the loadmeter changes scale occasionally, old
// decay values need to be rescaled. However, if they are rescaled,
// they could go off the edge of the screen. Thus, for now, to
// prevent this whole problem, the load meter can not be a decay
// meter. The load is a decaying average kind of thing anyway,
// so having a decaying load average is redundant.
std::cerr << "Warning: The loadmeter can not be configured as a decay\n"
<< " meter. See the source code (" << __FILE__ << ") for further\n"
<< " details.\n";
dodecay_ = 0;
}
}
void LoadMeter::checkevent( void ) {
getloadinfo();
if (do_cpu_speed_) {
old_cpu_speed_ = cur_cpu_speed_;
cur_cpu_speed_ = BSDGetCPUSpeed();
if (old_cpu_speed_ != cur_cpu_speed_) {
char l[25];
snprintf(l, 25, "PROCS/MIN %d MHz", cur_cpu_speed_);
legend(l);
drawlegend();
}
}
drawfields();
}
void LoadMeter::getloadinfo( void ) {
double oneMinLoad;
getloadavg(&oneMinLoad, 1); // Only get the 1-minute-average sample.
fields_[0] = oneMinLoad;
if (fields_[0] < warnThreshold_)
alarmstate_ = 0;
else if (fields_[0] >= critThreshold_)
alarmstate_ = 2;
else
alarmstate_ = 1;
if (alarmstate_ != lastalarmstate_) {
if (alarmstate_ == 0)
setfieldcolor(0, procloadcol_);
else if (alarmstate_ == 1)
setfieldcolor(0, warnloadcol_);
else
setfieldcolor(0, critloadcol_);
drawlegend();
lastalarmstate_ = alarmstate_;
}
// Adjust total to next power-of-two of the current load.
if ( (fields_[0]*5.0 < total_ && total_ > 1.0) || fields_[0] > total_ ) {
unsigned int i = fields_[0];
i |= i >> 1; i |= i >> 2; i |= i >> 4; i |= i >> 8; i |= i >> 16; // i = 2^n - 1
total_ = i + 1;
}
fields_[1] = total_ - fields_[0];
setUsed(fields_[0], total_);
}
|