ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/ihost/libstatgrab/memory_stats.c
Revision: 1.5
Committed: Sat May 18 18:15:56 2002 UTC (23 years, 7 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.4: +19 -0 lines
Log Message:
i-scream is now licensed under the GPL. I've added the GPL headers to every
source file, and put a full copy of the license in the appropriate places.
I think I've covered everything. This is going to be a mad commit ;)

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * Copyright (C) 2000-2002 i-scream
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 #include <stdio.h>
21 #ifdef LINUX
22 #include <string.h>
23 #endif
24 #ifdef SOLARIS
25 #include <unistd.h>
26 #include <kstat.h>
27 #endif
28 #ifdef FREEBSD
29 #include <sys/types.h>
30 #include <sys/sysctl.h>
31 #include <unistd.h>
32 #endif
33 #include "ukcprog.h"
34
35 char *get_memory_stats(){
36 long total=0;
37 long free=0;
38 long used=0;
39 long cache=0;
40 char *xml_memory_stats;
41 #ifdef LINUX
42 FILE *f;
43 char *line;
44 long buffers;
45 #endif
46 #ifdef SOLARIS
47 kstat_ctl_t *kc;
48 kstat_t *ksp;
49 kstat_named_t *kn;
50 u_long totalmem;
51 int pagesize;
52 #endif
53 #ifdef FREEBSD
54 #define TOTAL_MEM_NAME "hw.physmem"
55 #define FREE_MEM_NAME "vm.stats.vm.v_free_count"
56 #define INACTIVE_MEM_NAME "vm.stats.vm.v_inactive_count"
57 #define CACHE_MEM_NAME "vm.stats.vm.v_cache_count"
58 int pagesize;
59 long inactive;
60 size_t size;
61 #endif
62
63 #ifdef LINUX
64 if ((f=fopen("/proc/meminfo", "r" ))==NULL) {
65 errf("Failed to open memory stats (%m)");
66 return NULL;
67 }
68 while((line=fpgetline(f)) != NULL){
69 if (((strncmp(line,"Mem:",4)) == 0)) {
70 if((sscanf(line, "%*s %ld %ld %ld %*s %ld %ld", &total, &used, &free, &buffers, &cache)) != 5){
71 errf("Failed to read memory details (%m)");
72 return NULL;
73 }
74 break;
75 }
76 }
77 if ((fclose(f)) != 0) {
78 errf("Failed to close file (%m)");
79 return NULL;
80 }
81
82 cache=cache+buffers;
83 used=total-(free+cache);
84
85 total=(total/1024)/1024;
86 used=(used/1024)/1024;
87 free=(free/1024)/1024;
88 cache=(free/1024)/1024;
89 #endif
90 #ifdef SOLARIS
91 if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
92 errf("Failed to get pagesize (%m)");
93 return NULL;
94 }
95
96 if((totalmem=sysconf(_SC_PHYS_PAGES)) == -1){
97 errf("Failed to get total memory");
98 return NULL;
99 }
100
101 if ((kc = kstat_open()) == NULL) {
102 errf("kstat_open failure (%m)");
103 return NULL;
104 }
105 if((ksp=kstat_lookup(kc, "unix", 0, "system_pages")) == NULL){
106 errf("kstat lookup for \"system_pages\" (%m)");
107 return NULL;
108 }
109 if (kstat_read(kc, ksp, 0) == -1) {
110 errf("Failed to read kstat details (%m)");
111 return NULL;
112 }
113 if((kn=kstat_data_lookup(ksp, "freemem")) == NULL){
114 errf("Failed to get free memory (%m)");
115 return NULL;
116 }
117 if((kstat_close(kc)) != 0){
118 errf("Failed to close kstat control structure (%m)");
119 return NULL;
120 }
121 total=((totalmem*pagesize)/1024)/1024;
122 free=(((kn->value.ul)*pagesize)/1024)/1024;
123 used=total-free;
124 #endif
125 #ifdef FREEBSD
126 if ((pagesize=getpagesize()) == -1){
127 errf("Failed to get page size (%m)");
128 return NULL;
129 }
130
131 if (sysctlbyname(TOTAL_MEM_NAME, NULL, &size, NULL, NULL) < 0){
132 errf("sysctlbyname failed to get total memory (%m)");
133 return NULL;
134 }
135 if (sysctlbyname(TOTAL_MEM_NAME, &total, &size, NULL, NULL) < 0){
136 errf("Failed to get total memory stats (%m)");
137 return NULL;
138 }
139
140 if (sysctlbyname(FREE_MEM_NAME, NULL, &size, NULL, NULL) < 0){
141 errf("sysctlbyname failed to get free memory (%m)");
142 return NULL;
143 }
144 if (sysctlbyname(FREE_MEM_NAME, &free, &size, NULL, NULL) < 0){
145 errf("Failed to get free memory stats (%m)");
146 return NULL;
147 }
148
149 if (sysctlbyname(INACTIVE_MEM_NAME, NULL, &size, NULL, NULL) < 0){
150 errf("sysctlbyname failed to get inactive memory (%m)");
151 return NULL;
152 }
153 if (sysctlbyname(INACTIVE_MEM_NAME, &inactive, &size, NULL, NULL) < 0){
154 errf("Failed to get inactive memory stats (%m)");
155 return NULL;
156 }
157
158 if (sysctlbyname(CACHE_MEM_NAME, NULL, &size, NULL, NULL) < 0){
159 errf("sysctlbyname failed to get cache memory (%m)");
160 return NULL;
161 }
162 if (sysctlbyname(CACHE_MEM_NAME, &cache, &size, NULL, NULL) < 0){
163 errf("Failed to get cache memory stats (%m)");
164 return NULL;
165 }
166
167 total/=(1024*1024);
168 free=((free*pagesize)/(1024*1024))+((inactive*pagesize)/(1024*1024));
169 cache=((cache*pagesize)/(1024*1024));
170
171 /* used should also be cache+active+wired but its less effort this way :) */
172 used=total-free;
173
174 #endif
175
176
177 if((xml_memory_stats=strf("<memory><total>%ld</total><free>%ld</free><used>%ld</used><cache>%ld</cache></memory>", total, free, used, cache)) == NULL){
178 errf("strf failed (%m)");
179 return NULL;
180 }
181 return xml_memory_stats;
182 }