ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/memory_stats.c
Revision: 1.11
Committed: Sat Oct 18 23:04:23 2003 UTC (20 years, 7 months ago) by ats
Content type: text/plain
Branch: MAIN
Changes since 1.10: +4 -0 lines
Log Message:
... and the size parameter should be initialised to the size of the
buffer first (although FreeBSD doesn't actually seem to care, NetBSD
does, and the manual page says so).

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2003 i-scream
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program 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
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "statgrab.h"
26 #ifdef SOLARIS
27 #include <unistd.h>
28 #include <kstat.h>
29 #endif
30 #ifdef LINUX
31 #include <stdio.h>
32 #include <string.h>
33 #include "tools.h"
34 #endif
35 #ifdef FREEBSD
36 #include <sys/types.h>
37 #include <sys/sysctl.h>
38 #include <unistd.h>
39 #endif
40
41 mem_stat_t *get_memory_stats(){
42
43 static mem_stat_t mem_stat;
44
45 #ifdef SOLARIS
46 kstat_ctl_t *kc;
47 kstat_t *ksp;
48 kstat_named_t *kn;
49 long totalmem;
50 int pagesize;
51 #endif
52 #ifdef LINUX
53 char *line_ptr;
54 FILE *f;
55 #endif
56 #ifdef FREEBSD
57 u_int free_count;
58 u_int cache_count;
59 u_int inactive_count;
60 u_long physmem;
61 size_t size;
62 int pagesize;
63 #endif
64
65 #ifdef SOLARIS
66 if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
67 return NULL;
68 }
69
70 if((totalmem=sysconf(_SC_PHYS_PAGES)) == -1){
71 return NULL;
72 }
73
74 if ((kc = kstat_open()) == NULL) {
75 return NULL;
76 }
77 if((ksp=kstat_lookup(kc, "unix", 0, "system_pages")) == NULL){
78 return NULL;
79 }
80 if (kstat_read(kc, ksp, 0) == -1) {
81 return NULL;
82 }
83 if((kn=kstat_data_lookup(ksp, "freemem")) == NULL){
84 return NULL;
85 }
86 kstat_close(kc);
87
88 mem_stat.total = (long long)totalmem * (long long)pagesize;
89 mem_stat.free = ((long long)kn->value.ul) * (long long)pagesize;
90 mem_stat.used = mem_stat.total - mem_stat.free;
91 #endif
92
93 #ifdef LINUX
94 f=fopen("/proc/meminfo", "r");
95 if(f==NULL){
96 return NULL;
97 }
98
99 if((line_ptr=f_read_line(f, "Mem:"))==NULL){
100 fclose(f);
101 return NULL;
102 }
103
104 fclose(f);
105
106 /* Linux actually stores this as a unsigned long long, but
107 * our structures are just long longs. This shouldn't be a
108 * problem for sometime yet :)
109 */
110 if((sscanf(line_ptr,"Mem: %lld %lld %lld %*d %*d %lld", \
111 &mem_stat.total, \
112 &mem_stat.used, \
113 &mem_stat.free, \
114 &mem_stat.cache))!=4){
115 return NULL;
116 }
117
118 #endif
119
120 #ifdef FREEBSD
121 /* Returns bytes */
122 size = sizeof physmem;
123 if (sysctlbyname("hw.physmem", &physmem, &size, NULL, 0) < 0){
124 return NULL;
125 }
126
127 /*returns pages*/
128 size = sizeof free_count;
129 if (sysctlbyname("vm.stats.vm.v_free_count", &free_count, &size, NULL, 0) < 0){
130 return NULL;
131 }
132
133 size = sizeof inactive_count;
134 if (sysctlbyname("vm.stats.vm.v_inactive_count", &inactive_count , &size, NULL, 0) < 0){
135 return NULL;
136 }
137
138 size = sizeof cache_count;
139 if (sysctlbyname("vm.stats.vm.v_cache_count", &cache_count, &size, NULL, 0) < 0){
140 return NULL;
141 }
142
143 /* Because all the vm.stats returns pages, I need to get the page size.
144 * After that I then need to multiple the anything that used vm.stats to
145 * get the system statistics by pagesize
146 */
147 if ((pagesize=getpagesize()) == -1){
148 return NULL;
149 }
150
151 mem_stat.total=physmem;
152 mem_stat.cache=cache_count*pagesize;
153
154 /* Of couse nothing is ever that simple :) And I have inactive pages to
155 * deal with too. So I'm going to add them to free memory :)
156 */
157 mem_stat.free=(free_count*pagesize)+(inactive_count*pagesize);
158 mem_stat.used=physmem-mem_stat.free;
159 #endif
160
161 return &mem_stat;
162
163 }