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

# User Rev Content
1 pajs 1.1 /*
2     * i-scream central monitoring system
3 tdb 1.7 * http://www.i-scream.org
4     * Copyright (C) 2000-2003 i-scream
5 pajs 1.1 *
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 pajs 1.5 #ifdef LINUX
31     #include <stdio.h>
32     #include <string.h>
33     #include "tools.h"
34     #endif
35 pajs 1.6 #ifdef FREEBSD
36     #include <sys/types.h>
37     #include <sys/sysctl.h>
38     #include <unistd.h>
39     #endif
40 pajs 1.1
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 pajs 1.5 #ifdef LINUX
53     char *line_ptr;
54     FILE *f;
55     #endif
56 pajs 1.6 #ifdef FREEBSD
57 tdb 1.8 u_int free_count;
58     u_int cache_count;
59     u_int inactive_count;
60 tdb 1.9 u_long physmem;
61 pajs 1.6 size_t size;
62     int pagesize;
63     #endif
64 pajs 1.1
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 pajs 1.2 kstat_close(kc);
87    
88 pajs 1.1 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 pajs 1.5 #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 pajs 1.6
118     #endif
119    
120     #ifdef FREEBSD
121 tdb 1.8 /* Returns bytes */
122 ats 1.11 size = sizeof physmem;
123 ats 1.10 if (sysctlbyname("hw.physmem", &physmem, &size, NULL, 0) < 0){
124 pajs 1.6 return NULL;
125     }
126    
127     /*returns pages*/
128 ats 1.11 size = sizeof free_count;
129 ats 1.10 if (sysctlbyname("vm.stats.vm.v_free_count", &free_count, &size, NULL, 0) < 0){
130 pajs 1.6 return NULL;
131     }
132    
133 ats 1.11 size = sizeof inactive_count;
134 ats 1.10 if (sysctlbyname("vm.stats.vm.v_inactive_count", &inactive_count , &size, NULL, 0) < 0){
135 pajs 1.6 return NULL;
136     }
137    
138 ats 1.11 size = sizeof cache_count;
139 ats 1.10 if (sysctlbyname("vm.stats.vm.v_cache_count", &cache_count, &size, NULL, 0) < 0){
140 pajs 1.6 return NULL;
141     }
142    
143 tdb 1.8 /* 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 pajs 1.6 */
147     if ((pagesize=getpagesize()) == -1){
148     return NULL;
149     }
150    
151 tdb 1.8 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 pajs 1.6 */
157 tdb 1.8 mem_stat.free=(free_count*pagesize)+(inactive_count*pagesize);
158     mem_stat.used=physmem-mem_stat.free;
159 pajs 1.1 #endif
160    
161     return &mem_stat;
162    
163     }