ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/memory_stats.c
Revision: 1.18
Committed: Fri Jan 16 15:54:54 2004 UTC (20 years, 4 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.17: +13 -12 lines
Log Message:
Alter the licensing of libstatgrab. The library part is now under the
LGPL, whilst the tools/examples are under the GPL. Both licenses are
included in the distribution (and are both now in CVS). Also made a
minor alteration to the webpage where it said everything was licensed
under the GPL.

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2004 i-scream
5 *
6 * 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 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * 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 */
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25
26 #include "statgrab.h"
27 #include "tools.h"
28 #ifdef SOLARIS
29 #include <unistd.h>
30 #include <kstat.h>
31 #endif
32 #if defined(LINUX) || defined(CYGWIN)
33 #include <stdio.h>
34 #include <string.h>
35 #endif
36 #ifdef FREEBSD
37 #include <sys/types.h>
38 #include <sys/sysctl.h>
39 #include <unistd.h>
40 #endif
41
42 mem_stat_t *get_memory_stats(){
43
44 static mem_stat_t mem_stat;
45
46 #ifdef SOLARIS
47 kstat_ctl_t *kc;
48 kstat_t *ksp;
49 kstat_named_t *kn;
50 long totalmem;
51 int pagesize;
52 #endif
53 #if defined(LINUX) || defined(CYGWIN)
54 char *line_ptr;
55 unsigned long long value;
56 FILE *f;
57 #endif
58 #ifdef FREEBSD
59 int mib[2];
60 u_long physmem;
61 size_t size;
62 u_int free_count;
63 u_int cache_count;
64 u_int inactive_count;
65 int pagesize;
66 #endif
67 #ifdef NETBSD
68 struct uvmexp *uvm;
69 #endif
70
71 #ifdef SOLARIS
72 if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
73 return NULL;
74 }
75
76 if((totalmem=sysconf(_SC_PHYS_PAGES)) == -1){
77 return NULL;
78 }
79
80 if ((kc = kstat_open()) == NULL) {
81 return NULL;
82 }
83 if((ksp=kstat_lookup(kc, "unix", 0, "system_pages")) == NULL){
84 return NULL;
85 }
86 if (kstat_read(kc, ksp, 0) == -1) {
87 return NULL;
88 }
89 if((kn=kstat_data_lookup(ksp, "freemem")) == NULL){
90 return NULL;
91 }
92 kstat_close(kc);
93
94 mem_stat.total = (long long)totalmem * (long long)pagesize;
95 mem_stat.free = ((long long)kn->value.ul) * (long long)pagesize;
96 mem_stat.used = mem_stat.total - mem_stat.free;
97 #endif
98
99 #if defined(LINUX) || defined(CYGWIN)
100 if ((f = fopen("/proc/meminfo", "r")) == NULL) {
101 return NULL;
102 }
103
104 while ((line_ptr = f_read_line(f, "")) != NULL) {
105 if (sscanf(line_ptr, "%*s %llu kB", &value) != 1) {
106 continue;
107 }
108 value *= 1024;
109
110 if (strncmp(line_ptr, "MemTotal:", 9) == 0) {
111 mem_stat.total = value;
112 } else if (strncmp(line_ptr, "MemFree:", 8) == 0) {
113 mem_stat.free = value;
114 } else if (strncmp(line_ptr, "Cached:", 7) == 0) {
115 mem_stat.cache = value;
116 }
117 }
118
119 fclose(f);
120 mem_stat.used = mem_stat.total - mem_stat.free;
121 #endif
122
123 #ifdef FREEBSD
124 /* Returns bytes */
125 mib[0] = CTL_HW;
126 mib[1] = HW_PHYSMEM;
127 size = sizeof physmem;
128 if (sysctl(mib, 2, &physmem, &size, NULL, 0) < 0) {
129 return NULL;
130 }
131 mem_stat.total = physmem;
132
133 /*returns pages*/
134 size = sizeof free_count;
135 if (sysctlbyname("vm.stats.vm.v_free_count", &free_count, &size, NULL, 0) < 0){
136 return NULL;
137 }
138
139 size = sizeof inactive_count;
140 if (sysctlbyname("vm.stats.vm.v_inactive_count", &inactive_count , &size, NULL, 0) < 0){
141 return NULL;
142 }
143
144 size = sizeof cache_count;
145 if (sysctlbyname("vm.stats.vm.v_cache_count", &cache_count, &size, NULL, 0) < 0){
146 return NULL;
147 }
148
149 /* Because all the vm.stats returns pages, I need to get the page size.
150 * After that I then need to multiple the anything that used vm.stats to
151 * get the system statistics by pagesize
152 */
153 if ((pagesize=getpagesize()) == -1){
154 return NULL;
155 }
156
157 mem_stat.cache=cache_count*pagesize;
158
159 /* Of couse nothing is ever that simple :) And I have inactive pages to
160 * deal with too. So I'm going to add them to free memory :)
161 */
162 mem_stat.free=(free_count*pagesize)+(inactive_count*pagesize);
163 mem_stat.used=physmem-mem_stat.free;
164 #endif
165
166 #ifdef NETBSD
167 if ((uvm = get_uvmexp()) == NULL) {
168 return NULL;
169 }
170 mem_stat.total = uvm->pagesize * uvm->npages;
171 mem_stat.cache = uvm->pagesize * (uvm->filepages + uvm->execpages);
172 mem_stat.free = uvm->pagesize * (uvm->free + uvm->inactive);
173 mem_stat.used = mem_stat.total - mem_stat.free;
174 #endif
175
176 return &mem_stat;
177 }