Skip to content

Commit faea029

Browse files
authored
Drop compatibility workaround and always use the generated taskstats def (#13)
1 parent 5164d42 commit faea029

File tree

2 files changed

+6
-204
lines changed

2 files changed

+6
-204
lines changed

Diff for: src/lib.rs

+5-203
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ mod model;
1010
pub(crate) mod netlink;
1111
pub use model::*;
1212

13-
pub use c_headers::taskstats as __bindgen_taskstats;
13+
pub use c_headers::taskstats;
1414
use c_headers::{
1515
__u16, __u32, __u64, __u8, TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK, TASKSTATS_CMD_ATTR_PID,
1616
TASKSTATS_CMD_ATTR_REGISTER_CPUMASK, TASKSTATS_CMD_ATTR_TGID, TASKSTATS_CMD_GET,
@@ -279,69 +279,6 @@ impl<T> AsBuf<T> for T {
279279
}
280280
}
281281

282-
/// This is custom copy of the generated `struct taskstats` from linux version 3.10.0 and in this crate
283-
/// this type is used to read binary data transferred from linux kernel.
284-
/// The reason of doing this despite the `bindgen` generates rust bindings including `struct taskstats`
285-
/// is due to potential corruption of on-memory struct layout likely caused by old clang version.
286-
/// ref: https://github.com/rust-lang/rust-bindgen/issues/867
287-
/// Specifically, when `bindgen` generates `struct taskstats` with older clang version, the resulting
288-
/// struct defined in generated rust source code contains size padding as the last member of the struct
289-
/// causing offset of members after `ac_uid` to shift 4-byte or more and the result data becomes unreliable.
290-
/// The `bindgen` generated definition works well in environment that uses newer clang versions, but I
291-
/// decided to use copied definition of this struct for the time being by following considerations:
292-
/// * The struct definition rarely evolves.
293-
/// * Returning corrupted data silently is critical and much worse than not providing from the beginning.
294-
/// * If user of this crate still needs to access the exactly original definition generated by `bindgen`,
295-
/// it might still be possible by casting type to `__bindgen_taskstats` exported by this crate.
296-
#[repr(C)]
297-
#[derive(Debug, Copy, Clone)]
298-
pub struct taskstats {
299-
pub version: __u16,
300-
pub ac_exitcode: __u32,
301-
pub ac_flag: __u8,
302-
pub ac_nice: __u8,
303-
pub cpu_count: __u64,
304-
pub cpu_delay_total: __u64,
305-
pub blkio_count: __u64,
306-
pub blkio_delay_total: __u64,
307-
pub swapin_count: __u64,
308-
pub swapin_delay_total: __u64,
309-
pub cpu_run_real_total: __u64,
310-
pub cpu_run_virtual_total: __u64,
311-
pub ac_comm: [::std::os::raw::c_char; 32usize],
312-
pub ac_sched: __u8,
313-
pub ac_pad: [__u8; 3usize],
314-
pub __unused_padding: u32,
315-
pub ac_uid: __u32,
316-
pub ac_gid: __u32,
317-
pub ac_pid: __u32,
318-
pub ac_ppid: __u32,
319-
pub ac_btime: __u32,
320-
pub ac_etime: __u64,
321-
pub ac_utime: __u64,
322-
pub ac_stime: __u64,
323-
pub ac_minflt: __u64,
324-
pub ac_majflt: __u64,
325-
pub coremem: __u64,
326-
pub virtmem: __u64,
327-
pub hiwater_rss: __u64,
328-
pub hiwater_vm: __u64,
329-
pub read_char: __u64,
330-
pub write_char: __u64,
331-
pub read_syscalls: __u64,
332-
pub write_syscalls: __u64,
333-
pub read_bytes: __u64,
334-
pub write_bytes: __u64,
335-
pub cancelled_write_bytes: __u64,
336-
pub nvcsw: __u64,
337-
pub nivcsw: __u64,
338-
pub ac_utimescaled: __u64,
339-
pub ac_stimescaled: __u64,
340-
pub cpu_scaled_run_real_total: __u64,
341-
pub freepages_count: __u64,
342-
pub freepages_delay_total: __u64,
343-
}
344-
345282
#[cfg(test)]
346283
mod tests {
347284
use super::*;
@@ -353,8 +290,8 @@ mod tests {
353290
let ts = client.pid_stats(std::process::id()).unwrap();
354291

355292
// Just asserts some fields which do likely have positive values
356-
assert!(ts.cpu.utime_total.as_nanos() > 0);
357-
assert!(ts.memory.rss_total > 0);
293+
assert!(ts.delays.cpu.delay_total.as_nanos() > 0);
294+
assert!(ts.cpu.virtual_time_total.as_nanos() > 0);
358295
}
359296

360297
#[cfg(test_priv)]
@@ -364,142 +301,7 @@ mod tests {
364301
let ts = client.tgid_stats(std::process::id()).unwrap();
365302

366303
// Just asserts some fields which do likely have positive values
367-
assert!(ts.cpu.utime_total.as_nanos() > 0);
368-
assert!(ts.memory.rss_total > 0);
369-
}
370-
371-
#[test]
372-
fn test_struct_taskstats_alignment() {
373-
// Automatically generated by tools/gen_layout_test.sh
374-
assert_eq!(328, std::mem::size_of::<taskstats>());
375-
assert_eq!(0, unsafe {
376-
&(*(std::ptr::null::<taskstats>())).version as *const _ as usize
377-
});
378-
assert_eq!(4, unsafe {
379-
&(*(std::ptr::null::<taskstats>())).ac_exitcode as *const _ as usize
380-
});
381-
assert_eq!(8, unsafe {
382-
&(*(std::ptr::null::<taskstats>())).ac_flag as *const _ as usize
383-
});
384-
assert_eq!(9, unsafe {
385-
&(*(std::ptr::null::<taskstats>())).ac_nice as *const _ as usize
386-
});
387-
assert_eq!(16, unsafe {
388-
&(*(std::ptr::null::<taskstats>())).cpu_count as *const _ as usize
389-
});
390-
assert_eq!(24, unsafe {
391-
&(*(std::ptr::null::<taskstats>())).cpu_delay_total as *const _ as usize
392-
});
393-
assert_eq!(32, unsafe {
394-
&(*(std::ptr::null::<taskstats>())).blkio_count as *const _ as usize
395-
});
396-
assert_eq!(40, unsafe {
397-
&(*(std::ptr::null::<taskstats>())).blkio_delay_total as *const _ as usize
398-
});
399-
assert_eq!(48, unsafe {
400-
&(*(std::ptr::null::<taskstats>())).swapin_count as *const _ as usize
401-
});
402-
assert_eq!(56, unsafe {
403-
&(*(std::ptr::null::<taskstats>())).swapin_delay_total as *const _ as usize
404-
});
405-
assert_eq!(64, unsafe {
406-
&(*(std::ptr::null::<taskstats>())).cpu_run_real_total as *const _ as usize
407-
});
408-
assert_eq!(72, unsafe {
409-
&(*(std::ptr::null::<taskstats>())).cpu_run_virtual_total as *const _ as usize
410-
});
411-
assert_eq!(80, unsafe {
412-
&(*(std::ptr::null::<taskstats>())).ac_comm as *const _ as usize
413-
});
414-
assert_eq!(112, unsafe {
415-
&(*(std::ptr::null::<taskstats>())).ac_sched as *const _ as usize
416-
});
417-
assert_eq!(113, unsafe {
418-
&(*(std::ptr::null::<taskstats>())).ac_pad as *const _ as usize
419-
});
420-
assert_eq!(120, unsafe {
421-
&(*(std::ptr::null::<taskstats>())).ac_uid as *const _ as usize
422-
});
423-
assert_eq!(124, unsafe {
424-
&(*(std::ptr::null::<taskstats>())).ac_gid as *const _ as usize
425-
});
426-
assert_eq!(128, unsafe {
427-
&(*(std::ptr::null::<taskstats>())).ac_pid as *const _ as usize
428-
});
429-
assert_eq!(132, unsafe {
430-
&(*(std::ptr::null::<taskstats>())).ac_ppid as *const _ as usize
431-
});
432-
assert_eq!(136, unsafe {
433-
&(*(std::ptr::null::<taskstats>())).ac_btime as *const _ as usize
434-
});
435-
assert_eq!(144, unsafe {
436-
&(*(std::ptr::null::<taskstats>())).ac_etime as *const _ as usize
437-
});
438-
assert_eq!(152, unsafe {
439-
&(*(std::ptr::null::<taskstats>())).ac_utime as *const _ as usize
440-
});
441-
assert_eq!(160, unsafe {
442-
&(*(std::ptr::null::<taskstats>())).ac_stime as *const _ as usize
443-
});
444-
assert_eq!(168, unsafe {
445-
&(*(std::ptr::null::<taskstats>())).ac_minflt as *const _ as usize
446-
});
447-
assert_eq!(176, unsafe {
448-
&(*(std::ptr::null::<taskstats>())).ac_majflt as *const _ as usize
449-
});
450-
assert_eq!(184, unsafe {
451-
&(*(std::ptr::null::<taskstats>())).coremem as *const _ as usize
452-
});
453-
assert_eq!(192, unsafe {
454-
&(*(std::ptr::null::<taskstats>())).virtmem as *const _ as usize
455-
});
456-
assert_eq!(200, unsafe {
457-
&(*(std::ptr::null::<taskstats>())).hiwater_rss as *const _ as usize
458-
});
459-
assert_eq!(208, unsafe {
460-
&(*(std::ptr::null::<taskstats>())).hiwater_vm as *const _ as usize
461-
});
462-
assert_eq!(216, unsafe {
463-
&(*(std::ptr::null::<taskstats>())).read_char as *const _ as usize
464-
});
465-
assert_eq!(224, unsafe {
466-
&(*(std::ptr::null::<taskstats>())).write_char as *const _ as usize
467-
});
468-
assert_eq!(232, unsafe {
469-
&(*(std::ptr::null::<taskstats>())).read_syscalls as *const _ as usize
470-
});
471-
assert_eq!(240, unsafe {
472-
&(*(std::ptr::null::<taskstats>())).write_syscalls as *const _ as usize
473-
});
474-
assert_eq!(248, unsafe {
475-
&(*(std::ptr::null::<taskstats>())).read_bytes as *const _ as usize
476-
});
477-
assert_eq!(256, unsafe {
478-
&(*(std::ptr::null::<taskstats>())).write_bytes as *const _ as usize
479-
});
480-
assert_eq!(264, unsafe {
481-
&(*(std::ptr::null::<taskstats>())).cancelled_write_bytes as *const _ as usize
482-
});
483-
assert_eq!(272, unsafe {
484-
&(*(std::ptr::null::<taskstats>())).nvcsw as *const _ as usize
485-
});
486-
assert_eq!(280, unsafe {
487-
&(*(std::ptr::null::<taskstats>())).nivcsw as *const _ as usize
488-
});
489-
assert_eq!(288, unsafe {
490-
&(*(std::ptr::null::<taskstats>())).ac_utimescaled as *const _ as usize
491-
});
492-
assert_eq!(296, unsafe {
493-
&(*(std::ptr::null::<taskstats>())).ac_stimescaled as *const _ as usize
494-
});
495-
assert_eq!(304, unsafe {
496-
&(*(std::ptr::null::<taskstats>())).cpu_scaled_run_real_total as *const _ as usize
497-
});
498-
assert_eq!(312, unsafe {
499-
&(*(std::ptr::null::<taskstats>())).freepages_count as *const _ as usize
500-
});
501-
assert_eq!(320, unsafe {
502-
&(*(std::ptr::null::<taskstats>())).freepages_delay_total as *const _ as usize
503-
});
304+
assert!(ts.delays.cpu.delay_total.as_nanos() > 0);
305+
assert!(ts.cpu.virtual_time_total.as_nanos() > 0);
504306
}
505307
}

Diff for: src/model.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub const TASKSTATS_SIZE: usize = const_max(
2222
/// There are more (but may not much interested) fields in the original
2323
/// `struct taskstats` and they are accessible through obtaining the original
2424
/// struct by `TaskStats#inner()`.
25-
#[derive(Clone, Copy)]
25+
#[derive(Clone, Copy, Debug)]
2626
pub struct TaskStats {
2727
pub(crate) inner_buf: [u8; TASKSTATS_SIZE],
2828
/// The target task ID

0 commit comments

Comments
 (0)