File: diskmeter.cc

package info (click to toggle)
xosview 1.24-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,184 kB
  • sloc: cpp: 11,975; makefile: 154; ansic: 32; awk: 13; sh: 8
file content (79 lines) | stat: -rw-r--r-- 2,167 bytes parent folder | download | duplicates (5)
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
//  
//  Rewritten for Solaris by Arno Augustin 1999
//  augustin@informatik.uni-erlangen.de
//

#include "diskmeter.h"
#include <stdlib.h>


DiskMeter::DiskMeter( XOSView *parent, kstat_ctl_t *kc, float max )
    : FieldMeterGraph( parent, 3, "DISK", "READ/WRITE/IDLE" )
{
    _kc = kc;
    _read_prev = _write_prev = 0;
    _maxspeed = max;
    _disks = KStatList::getList(_kc, KStatList::DISKS);
}

DiskMeter::~DiskMeter( void )
{
}

void DiskMeter::checkResources( void )
{
    FieldMeterGraph::checkResources();

    setfieldcolor( 0, parent_->getResource("diskReadColor") );
    setfieldcolor( 1, parent_->getResource("diskWriteColor") );
    setfieldcolor( 2, parent_->getResource("diskIdleColor") );
    priority_ = atoi( parent_->getResource("diskPriority") );
    dodecay_ = parent_->isResourceTrue("diskDecay");
    useGraph_ = parent_->isResourceTrue("diskGraph");
    SetUsedFormat( parent_->getResource("diskUsedFormat") );
}

void DiskMeter::checkevent( void )
{
    getdiskinfo();
    drawfields();
}

void DiskMeter::getdiskinfo( void )
{
    total_ = _maxspeed;
    kstat_io_t kio;
    uint64_t read_curr = 0, write_curr = 0;
    _disks->update(_kc);

    IntervalTimerStop();
    for (unsigned int i = 0; i < _disks->count(); i++) {
        if ( kstat_read(_kc, (*_disks)[i], &kio) == -1 )
            continue;
        XOSDEBUG("%s: %llu bytes read %llu bytes written.\n",
                 (*_disks)[i]->ks_name, kio.nread, kio.nwritten);
        read_curr += kio.nread;
        write_curr += kio.nwritten;
    }
    if (_read_prev == 0)
        _read_prev = read_curr;
    if (_write_prev == 0)
        _write_prev = write_curr;

    double t = IntervalTimeInSecs();
    fields_[0] = (double)(read_curr - _read_prev) / t;
    fields_[1] = (double)(write_curr - _write_prev) / t;

    IntervalTimerStart();
    _read_prev = read_curr;
    _write_prev = write_curr;

    if (fields_[0] < 0)
        fields_[0] = 0;
    if (fields_[1] < 0)
        fields_[1] = 0;
    if (fields_[0] + fields_[1] > total_)
        total_ = fields_[0] + fields_[1];
    fields_[2] = total_ - (fields_[0] + fields_[1]);
    setUsed(fields_[0] + fields_[1], total_);
}