@@ -200,6 +200,47 @@ fn stat_mount(mount: ProcMountsData) -> io::Result<Filesystem> {
200
200
}
201
201
}
202
202
203
+ /// Parse a line of `/proc/diskstats`
204
+ named ! (
205
+ proc_diskstats_line<BlockDeviceStats >,
206
+ ws!( do_parse!(
207
+ major_number: usize_s >>
208
+ minor_number: usize_s >>
209
+ name: word_s >>
210
+ read_ios: usize_s >>
211
+ read_merges: usize_s >>
212
+ read_sectors: usize_s >>
213
+ read_ticks: usize_s >>
214
+ write_ios: usize_s >>
215
+ write_merges: usize_s >>
216
+ write_sectors: usize_s >>
217
+ write_ticks: usize_s >>
218
+ in_flight: usize_s >>
219
+ io_ticks: usize_s >>
220
+ time_in_queue: usize_s >>
221
+ ( BlockDeviceStats {
222
+ name: name,
223
+ read_ios: read_ios,
224
+ read_merges: read_merges,
225
+ read_sectors: read_sectors,
226
+ read_ticks: read_ticks,
227
+ write_ios: write_ios,
228
+ write_merges: write_merges,
229
+ write_sectors: write_sectors,
230
+ write_ticks: write_ticks,
231
+ in_flight: in_flight,
232
+ io_ticks: io_ticks,
233
+ time_in_queue: time_in_queue
234
+ } )
235
+ ) )
236
+ ) ;
237
+
238
+ /// Parse `/proc/diskstats` to get a Vec<BlockDeviceStats>
239
+ named ! ( proc_diskstats<Vec <BlockDeviceStats >>,
240
+ many0!( ws!( flat_map!( not_line_ending, proc_diskstats_line) ) )
241
+ ) ;
242
+
243
+
203
244
pub struct PlatformImpl ;
204
245
205
246
/// An implementation of `Platform` for Linux.
@@ -370,6 +411,21 @@ impl Platform for PlatformImpl {
370
411
. and_then ( stat_mount)
371
412
}
372
413
414
+ fn block_device_statistics ( & self ) -> io:: Result < BTreeMap < String , BlockDeviceStats > > {
415
+ let mut result: BTreeMap < String , BlockDeviceStats > = BTreeMap :: new ( ) ;
416
+ let stats: Vec < BlockDeviceStats > = try!( read_file ( "/proc/diskstats" )
417
+ . and_then ( |data| {
418
+ proc_diskstats ( data. as_bytes ( ) ) . to_result ( )
419
+ . map_err ( |err| io:: Error :: new ( io:: ErrorKind :: InvalidData , err) )
420
+ } )
421
+ ) ;
422
+
423
+ for blkstats in stats {
424
+ result. entry ( blkstats. name . clone ( ) ) . or_insert ( blkstats) ;
425
+ }
426
+ Ok ( result)
427
+ }
428
+
373
429
fn networks ( & self ) -> io:: Result < BTreeMap < String , Network > > {
374
430
unix:: networks ( )
375
431
}
0 commit comments