@@ -10,7 +10,7 @@ mod model;
10
10
pub ( crate ) mod netlink;
11
11
pub use model:: * ;
12
12
13
- pub use c_headers:: taskstats as __bindgen_taskstats ;
13
+ pub use c_headers:: taskstats;
14
14
use c_headers:: {
15
15
__u16, __u32, __u64, __u8, TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK , TASKSTATS_CMD_ATTR_PID ,
16
16
TASKSTATS_CMD_ATTR_REGISTER_CPUMASK , TASKSTATS_CMD_ATTR_TGID , TASKSTATS_CMD_GET ,
@@ -279,69 +279,6 @@ impl<T> AsBuf<T> for T {
279
279
}
280
280
}
281
281
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
-
345
282
#[ cfg( test) ]
346
283
mod tests {
347
284
use super :: * ;
@@ -353,8 +290,8 @@ mod tests {
353
290
let ts = client. pid_stats ( std:: process:: id ( ) ) . unwrap ( ) ;
354
291
355
292
// 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 ) ;
358
295
}
359
296
360
297
#[ cfg( test_priv) ]
@@ -364,142 +301,7 @@ mod tests {
364
301
let ts = client. tgid_stats ( std:: process:: id ( ) ) . unwrap ( ) ;
365
302
366
303
// 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 ) ;
504
306
}
505
307
}
0 commit comments