@@ -26,7 +26,7 @@ impl From<io::Error> for MeminfoError {
26
26
}
27
27
28
28
#[ derive( Debug ) ]
29
- pub struct MeminfoStatus {
29
+ pub struct Meminfo {
30
30
pub memtotal : u64 ,
31
31
pub memfree : u64 ,
32
32
pub memavailable : u64 ,
@@ -71,14 +71,17 @@ pub struct MeminfoStatus {
71
71
pub directmap4k : u64 ,
72
72
pub directmap2m : u64 ,
73
73
pub directmap1g : u64 ,
74
+ pub mainused : u64 ,
75
+ pub maincached : u64 ,
76
+ pub mainswapused : u64 ,
74
77
}
75
78
76
79
77
80
/// Parses the contents of /proc/meminfo into a new Meminfo structure
78
81
///
79
82
/// # Examples
80
83
81
- impl MeminfoStatus {
84
+ impl Meminfo {
82
85
pub fn new ( ) -> Result < Self , MeminfoError > {
83
86
// Create an interim hashmap
84
87
// Read the file?
@@ -88,7 +91,26 @@ impl MeminfoStatus {
88
91
let lines = try!( io:: BufReader :: new ( minfo_file)
89
92
. lines ( ) // We have a Lines of many Result<&str>
90
93
. collect :: < Result < Vec < _ > , _ > > ( ) ) ; // This line makes Result<vec<&str>> Or result<err>
91
- let hmap = try!( lines. iter ( ) . map ( |line| Self :: parse_line ( line) ) . collect :: < Result < HashMap < _ , _ > , _ > > ( ) ) ;
94
+ let mut hmap = try!( lines. iter ( ) . map ( |line| Self :: parse_line ( line) ) . collect :: < Result < HashMap < _ , _ > , _ > > ( ) ) ;
95
+ // Calculate some of the other values
96
+ // kb_main_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffe
97
+ let total = hmap. get ( "MemTotal" ) . unwrap ( ) . clone ( ) ;
98
+ let free = hmap. get ( "MemFree" ) . unwrap ( ) . clone ( ) ;
99
+ let cached = hmap. get ( "Cached" ) . unwrap ( ) . clone ( ) ;
100
+ let buffer = hmap. get ( "Buffers" ) . unwrap ( ) . clone ( ) ;
101
+ let used = total - free - cached - buffer;
102
+ hmap. insert ( "MainUsed" . to_owned ( ) , used) ;
103
+
104
+ // kb_main_cached = kb_page_cache + kb_slab
105
+ let page_cache = hmap. get ( "Cached" ) . unwrap ( ) . clone ( ) ;
106
+ let slab = hmap. get ( "Slab" ) . unwrap ( ) . clone ( ) ;
107
+ hmap. insert ( "MainCached" . to_owned ( ) , ( page_cache + slab) ) ;
108
+
109
+ // kb_swap_used = kb_swap_total - kb_swap_free
110
+ let swap_total = hmap. get ( "SwapTotal" ) . unwrap ( ) . clone ( ) ;
111
+ let swap_free = hmap. get ( "SwapFree" ) . unwrap ( ) . clone ( ) ;
112
+ hmap. insert ( "MainSwapUsed" . to_owned ( ) , ( swap_total - swap_free) ) ;
113
+
92
114
// Populate the results
93
115
Self :: build_minfo ( hmap)
94
116
}
@@ -104,9 +126,9 @@ impl MeminfoStatus {
104
126
}
105
127
106
128
//This then takes the values out and puts them into an minfo
107
- fn build_minfo ( hmap : HashMap < String , u64 > ) -> Result < MeminfoStatus , MeminfoError > {
129
+ fn build_minfo ( hmap : HashMap < String , u64 > ) -> Result < Meminfo , MeminfoError > {
108
130
// REALLY REALLY improve this handling of Option types ...
109
- let minfo = MeminfoStatus {
131
+ let minfo = Meminfo {
110
132
memtotal : hmap. get ( "MemTotal" ) . unwrap ( ) . clone ( ) ,
111
133
memfree : hmap. get ( "MemFree" ) . unwrap ( ) . clone ( ) ,
112
134
memavailable : hmap. get ( "MemAvailable" ) . unwrap ( ) . clone ( ) ,
@@ -151,14 +173,17 @@ impl MeminfoStatus {
151
173
directmap4k : hmap. get ( "DirectMap4k" ) . unwrap ( ) . clone ( ) ,
152
174
directmap2m : hmap. get ( "DirectMap2M" ) . unwrap ( ) . clone ( ) ,
153
175
directmap1g : hmap. get ( "DirectMap1G" ) . unwrap ( ) . clone ( ) ,
176
+ mainused : hmap. get ( "MainUsed" ) . unwrap ( ) . clone ( ) ,
177
+ maincached : hmap. get ( "MainCached" ) . unwrap ( ) . clone ( ) ,
178
+ mainswapused : hmap. get ( "MainSwapUsed" ) . unwrap ( ) . clone ( ) ,
154
179
} ;
155
180
Ok ( minfo)
156
181
}
157
182
158
183
}
159
184
160
185
161
- impl fmt:: Display for MeminfoStatus {
186
+ impl fmt:: Display for Meminfo {
162
187
// make a display method to dump the whole struct
163
188
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
164
189
// This won't be nice for all the values we have ...
0 commit comments