~ubuntu-branches/ubuntu/karmic/wmcpuload/karmic

« back to all changes in this revision

Viewing changes to src/cpu_linux.c

  • Committer: Bazaar Package Importer
  • Author(s): Christian Aichinger
  • Date: 2005-02-13 18:42:41 UTC
  • mfrom: (2.1.1 warty)
  • Revision ID: james.westby@ubuntu.com-20050213184241-yk2o743d8rkp23t9
Tags: 1.0.1-2
* New Maintainer
* Added proper Linux 2.6 support, thanks to Peter Colberg for the patch.
  (Closes: #238684)
* debian/control: Standards-Version to 3.6.1.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: cpu_linux.c,v 1.1.1.1 2002/10/14 09:31:17 sch Exp $ */
 
2
 
1
3
/*
2
4
 * cpu_linux.c - module to get cpu usage, for GNU/Linux
3
5
 *
33
35
 
34
36
void cpu_init(void)
35
37
{
36
 
    /*  You don't need initialization under GNU/Linux*/
 
38
    /*  You don't need initialization under GNU/Linux */
37
39
    return;
38
40
}
39
41
 
40
 
/* returns current CPU usage in percent */
 
42
/* returns current cpu usage in percent */
41
43
int
42
 
cpu_get_usage(struct cpu_options *opts)
 
44
cpu_get_usage(cpu_options *opts)
43
45
{
44
 
    static int pre_usage, pre_total;
45
 
    static int pre_ig_usage;
46
 
    int result;
47
 
    int cpu, nice, system, idle;
48
 
    int usage = 0, total = 0;
49
 
    int ig_usage = 0;
 
46
    static int pre_used, pre_total;
 
47
    static int pre_ig_used;
 
48
    int usage;
 
49
        // Initialize all of these to zero, so that if fscanf partially fails
 
50
        // (eg on 2.4 where iowait, irq, softirq are missing), we still get
 
51
        // correct results.
 
52
    int cpu = 0, nice = 0, system = 0, idle = 0;
 
53
        int iowait = 0, irq = 0, softirq = 0;
 
54
    int used = 0, total = 0;
 
55
    int ig_used = 0;
50
56
    int i;
51
57
 
52
58
    FILE *fp;
55
61
        exit(1);
56
62
    }
57
63
 
58
 
    fscanf(fp, "%*s %d %d %d %d", &cpu, &nice, &system, &idle);
 
64
    fscanf(fp, "%*s %d %d %d %d %d %d %d", &cpu, &nice, &system, &idle, &iowait, &irq, &softirq);
59
65
 
60
66
#ifdef USE_SMP
61
67
    if (opts->cpu_number >= 0) {
66
72
        }
67
73
        
68
74
        for (i = 0; i <= opts->cpu_number; i++) {
69
 
            fscanf(fp, "%s %d %d %d %d", cpu_name, &cpu, &nice, &system, &idle);
 
75
            fscanf(fp, "%s %d %d %d %d %d %d %d", cpu_name, &cpu, &nice, &system, &idle, &iowait, &irq, &softirq);
70
76
            if (strncmp(cpu_name, "cpu", 3)){
71
 
                fprintf (stderr, "could not find cpu%d!\n", opts->cpu_number);
 
77
                fprintf (stderr, "can't find cpu%d!\n", opts->cpu_number);
72
78
                exit (1);
73
79
            }
74
80
        }
76
82
#endif /* USE_SMP */
77
83
 
78
84
    fclose(fp);
79
 
    usage = cpu + system;
 
85
    used = cpu + system;
80
86
    if (!opts->ignore_nice)
81
 
        usage += nice;
82
 
    total = cpu + nice + system + idle;
 
87
        used += nice;
 
88
    total = cpu + nice + system + idle + iowait + irq + softirq;
83
89
 
84
90
    /* get CPU usage of processes which specified by name with '-p' option */
85
91
    if (opts->ignore_procs) {
90
96
        }
91
97
        set_pidlist_from_namelist(opts->ignore_procs, opts->ignore_proc_list);
92
98
        for (i = 0; i < pids; i++)
93
 
            ig_usage += get_cpuusage_bypid(pid_list[i]);
 
99
            ig_used += get_cpuusage_bypid(pid_list[i]);
94
100
        free(pid_list);
95
101
    }
96
102
 
97
103
    /* calc CPU usage */
98
 
    if (pre_total == 0) {
99
 
        result = 0;
100
 
    } else if ((total - pre_total) > 0) {
101
 
        if ((ig_usage - pre_ig_usage) > 0)
102
 
            result = (100 * (double)(usage - pre_usage - ig_usage + pre_ig_usage)) /
103
 
                            (double)(total - pre_total);
104
 
        else
105
 
            result = (100 * (double)(usage - pre_usage)) /
106
 
                            (double)(total - pre_total);
 
104
    if ((pre_total == 0) || !(total - pre_total > 0)) {
 
105
        usage = 0;
 
106
    } else  if (ig_used - pre_ig_used > 0) {
 
107
        usage = (100 * (double)(used - pre_used - ig_used + pre_ig_used)) /
 
108
                (double)(total - pre_total);
107
109
    } else {
108
 
        result = 0;
 
110
        usage = (100 * (double)(used - pre_used)) / (double)(total - pre_total);
109
111
    }
110
112
 
111
113
    /* save current values for next calculation */
112
 
    pre_ig_usage = ig_usage;
113
 
    pre_usage = usage;
 
114
    pre_ig_used = ig_used;
 
115
    pre_used = used;
114
116
    pre_total = total;
115
117
 
116
 
    return result;
 
118
    return usage;
117
119
}
118
120
 
119
121
/* set pid list table from command names */
170
172
 
171
173
    sprintf(path, "/proc/%d/stat", pid);
172
174
    if ((fp = fopen(path, "r")) != NULL) {
173
 
        fscanf(fp,
174
 
               "%*d %*s %*s %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %d %d ",
 
175
        fscanf(fp, "%*d %*s %*s %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %d %d ",
175
176
               &utime, &stime);
176
177
        fclose(fp);
177
178
    }