ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/load_stats.c
Revision: 1.20
Committed: Sun Oct 3 18:35:57 2010 UTC (13 years, 7 months ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.19: +20 -1 lines
Log Message:
Add support for AIX 5.x - 9.x.

Many thanks to Jens Rehsack <rehsack@googlemail.com> for providing the
patch for this work. Thanks!

File Contents

# User Rev Content
1 tdb 1.8 /*
2 tdb 1.13 * i-scream libstatgrab
3 tdb 1.4 * http://www.i-scream.org
4 tdb 1.8 * Copyright (C) 2000-2004 i-scream
5 pajs 1.1 *
6 tdb 1.8 * This library is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU Lesser General Public
8     * License as published by the Free Software Foundation; either
9     * version 2.1 of the License, or (at your option) any later version.
10 pajs 1.1 *
11 tdb 1.8 * This library is distributed in the hope that it will be useful,
12 pajs 1.1 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 tdb 1.8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     * Lesser General Public License for more details.
15 pajs 1.1 *
16 tdb 1.8 * You should have received a copy of the GNU Lesser General Public
17     * License along with this library; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19     * 02111-1307 USA
20 tdb 1.9 *
21 tdb 1.20 * $Id: load_stats.c,v 1.19 2006/10/09 14:09:38 tdb Exp $
22 pajs 1.1 */
23    
24     #ifdef HAVE_CONFIG_H
25     #include "config.h"
26     #endif
27    
28     #include <stdio.h>
29     #include <stdlib.h>
30 tdb 1.3 #include "statgrab.h"
31 pajs 1.1 #ifdef SOLARIS
32 pajs 1.10 #ifdef HAVE_SYS_LOADAVG_H
33 pajs 1.1 #include <sys/loadavg.h>
34 pajs 1.10 #else
35     #include <kstat.h>
36     #endif
37 pajs 1.1 #endif
38 tdb 1.16 #ifdef HPUX
39     #include <sys/param.h>
40     #include <sys/pstat.h>
41     #endif
42 tdb 1.20 #ifdef AIX
43     #include <strings.h>
44     #include <sys/proc.h>
45     #include <libperfstat.h>
46     #endif
47 pajs 1.1
48 ats 1.12 sg_load_stats *sg_get_load_stats(){
49 pajs 1.1
50 tdb 1.18 #if !defined(CYGWIN) && !defined(WIN32)
51 ats 1.12 static sg_load_stats load_stat;
52 pajs 1.1
53 tdb 1.16 #ifdef HPUX
54     struct pst_dynamic pstat_dynamic;
55 tdb 1.20 #elif defined(AIX)
56     perfstat_cpu_total_t all_cpu_info;
57     int rc;
58 ats 1.17 #else
59     double loadav[3];
60 tdb 1.16 #endif
61 tdb 1.18 #endif /* not CYGWIN or WIN32 */
62 ats 1.6
63     #ifdef CYGWIN
64 tdb 1.15 sg_set_error(SG_ERROR_UNSUPPORTED, "Cygwin");
65 tdb 1.18 return NULL;
66     #elif defined(WIN32)
67     sg_set_error(SG_ERROR_UNSUPPORTED, "Win32");
68 ats 1.6 return NULL;
69     #else
70 tdb 1.5
71 pajs 1.10 #if defined(SOLARIS) && !defined(HAVE_SYS_LOADAVG_H)
72 pajs 1.11
73     kstat_ctl_t *kc;
74 tdb 1.14 kstat_t *ksp;
75     kstat_named_t *kn;
76 pajs 1.10
77     if ((kc = kstat_open()) == NULL) {
78 tdb 1.15 sg_set_error(SG_ERROR_KSTAT_OPEN, NULL);
79 tdb 1.14 return NULL;
80     }
81 pajs 1.10
82 pajs 1.11 if((ksp=kstat_lookup(kc, "unix", 0, "system_misc")) == NULL){
83 tdb 1.15 sg_set_error(SG_ERROR_KSTAT_LOOKUP, "unix,0,system_misc");
84 tdb 1.19 kstat_close(kc);
85 tdb 1.14 return NULL;
86     }
87 pajs 1.10
88 tdb 1.14 if (kstat_read(kc, ksp, 0) == -1) {
89 tdb 1.15 sg_set_error(SG_ERROR_KSTAT_READ, NULL);
90 tdb 1.19 kstat_close(kc);
91 tdb 1.14 return NULL;
92     }
93 pajs 1.10
94 tdb 1.19 kstat_close(kc);
95    
96 pajs 1.10 if((kn=kstat_data_lookup(ksp, "avenrun_1min")) == NULL){
97 tdb 1.15 sg_set_error(SG_ERROR_KSTAT_DATA_LOOKUP, "avenrun_1min");
98 tdb 1.14 return NULL;
99     }
100 pajs 1.11 load_stat.min1 = (double)kn->value.ui32 / (double)256;
101 pajs 1.10
102 tdb 1.14 if((kn=kstat_data_lookup(ksp, "avenrun_5min")) == NULL){
103 tdb 1.15 sg_set_error(SG_ERROR_KSTAT_DATA_LOOKUP, "avenrun_5min");
104 tdb 1.14 return NULL;
105     }
106     load_stat.min5 = (double)kn->value.ui32 / (double)256;
107    
108     if((kn=kstat_data_lookup(ksp, "avenrun_15min")) == NULL){
109 tdb 1.15 sg_set_error(SG_ERROR_KSTAT_DATA_LOOKUP, "avenrun_15min");
110 tdb 1.14 return NULL;
111     }
112     load_stat.min15 = (double)kn->value.ui32 / (double)256;
113 tdb 1.16 #elif defined(HPUX)
114     if (pstat_getdynamic(&pstat_dynamic, sizeof(pstat_dynamic), 1, 0) == -1) {
115     sg_set_error_with_errno(SG_ERROR_PSTAT, "pstat_dynamic");
116     return NULL;
117     }
118    
119     load_stat.min1=pstat_dynamic.psd_avg_1_min;
120     load_stat.min5=pstat_dynamic.psd_avg_5_min;
121     load_stat.min15=pstat_dynamic.psd_avg_15_min;
122 tdb 1.20 #elif defined(AIX)
123     rc = perfstat_cpu_total( NULL, &all_cpu_info, sizeof(all_cpu_info), 1);
124     if( -1 == rc ) {
125     bzero(&load_stat, sizeof(load_stat));
126     sg_set_error_with_errno(SG_ERROR_PSTAT, "perfstat_cpu_total");
127     return NULL;
128     } else {
129     load_stat.min1 = (double) all_cpu_info.loadavg[0] / (double)(1 << SBITS);
130     load_stat.min5 = (double) all_cpu_info.loadavg[1] / (double)(1 << SBITS);
131     load_stat.min15 = (double) all_cpu_info.loadavg[2] / (double)(1 << SBITS);
132     }
133 pajs 1.10 #else
134 ats 1.6 getloadavg(loadav,3);
135 pajs 1.1
136     load_stat.min1=loadav[0];
137     load_stat.min5=loadav[1];
138     load_stat.min15=loadav[2];
139 pajs 1.10 #endif
140 pajs 1.1
141     return &load_stat;
142 ats 1.6 #endif
143 pajs 1.1 }