1 #[cfg(tokio_internal_mt_counters)] 2 mod imp { 3 use std::sync::atomic::AtomicUsize; 4 use std::sync::atomic::Ordering::Relaxed; 5 6 static NUM_MAINTENANCE: AtomicUsize = AtomicUsize::new(0); 7 static NUM_NOTIFY_LOCAL: AtomicUsize = AtomicUsize::new(0); 8 static NUM_NOTIFY_REMOTE: AtomicUsize = AtomicUsize::new(0); 9 static NUM_UNPARKS_LOCAL: AtomicUsize = AtomicUsize::new(0); 10 static NUM_UNPARKS_REMOTE: AtomicUsize = AtomicUsize::new(0); 11 static NUM_LIFO_SCHEDULES: AtomicUsize = AtomicUsize::new(0); 12 static NUM_LIFO_CAPPED: AtomicUsize = AtomicUsize::new(0); 13 static NUM_STEALS: AtomicUsize = AtomicUsize::new(0); 14 static NUM_OVERFLOW: AtomicUsize = AtomicUsize::new(0); 15 static NUM_PARK: AtomicUsize = AtomicUsize::new(0); 16 static NUM_POLLS: AtomicUsize = AtomicUsize::new(0); 17 static NUM_LIFO_POLLS: AtomicUsize = AtomicUsize::new(0); 18 static NUM_REMOTE_BATCH: AtomicUsize = AtomicUsize::new(0); 19 static NUM_GLOBAL_QUEUE_INTERVAL: AtomicUsize = AtomicUsize::new(0); 20 static NUM_NO_AVAIL_CORE: AtomicUsize = AtomicUsize::new(0); 21 static NUM_RELAY_SEARCH: AtomicUsize = AtomicUsize::new(0); 22 static NUM_SPIN_STALL: AtomicUsize = AtomicUsize::new(0); 23 static NUM_NO_LOCAL_WORK: AtomicUsize = AtomicUsize::new(0); 24 25 impl Drop for super::Counters { drop(&mut self)26 fn drop(&mut self) { 27 let notifies_local = NUM_NOTIFY_LOCAL.load(Relaxed); 28 let notifies_remote = NUM_NOTIFY_REMOTE.load(Relaxed); 29 let unparks_local = NUM_UNPARKS_LOCAL.load(Relaxed); 30 let unparks_remote = NUM_UNPARKS_REMOTE.load(Relaxed); 31 let maintenance = NUM_MAINTENANCE.load(Relaxed); 32 let lifo_scheds = NUM_LIFO_SCHEDULES.load(Relaxed); 33 let lifo_capped = NUM_LIFO_CAPPED.load(Relaxed); 34 let num_steals = NUM_STEALS.load(Relaxed); 35 let num_overflow = NUM_OVERFLOW.load(Relaxed); 36 let num_park = NUM_PARK.load(Relaxed); 37 let num_polls = NUM_POLLS.load(Relaxed); 38 let num_lifo_polls = NUM_LIFO_POLLS.load(Relaxed); 39 let num_remote_batch = NUM_REMOTE_BATCH.load(Relaxed); 40 let num_global_queue_interval = NUM_GLOBAL_QUEUE_INTERVAL.load(Relaxed); 41 let num_no_avail_core = NUM_NO_AVAIL_CORE.load(Relaxed); 42 let num_relay_search = NUM_RELAY_SEARCH.load(Relaxed); 43 let num_spin_stall = NUM_SPIN_STALL.load(Relaxed); 44 let num_no_local_work = NUM_NO_LOCAL_WORK.load(Relaxed); 45 46 println!("---"); 47 println!("notifies (remote): {}", notifies_remote); 48 println!(" notifies (local): {}", notifies_local); 49 println!(" unparks (local): {}", unparks_local); 50 println!(" unparks (remote): {}", unparks_remote); 51 println!(" notify, no core: {}", num_no_avail_core); 52 println!(" maintenance: {}", maintenance); 53 println!(" LIFO schedules: {}", lifo_scheds); 54 println!(" LIFO capped: {}", lifo_capped); 55 println!(" steals: {}", num_steals); 56 println!(" queue overflows: {}", num_overflow); 57 println!(" parks: {}", num_park); 58 println!(" polls: {}", num_polls); 59 println!(" polls (LIFO): {}", num_lifo_polls); 60 println!("remote task batch: {}", num_remote_batch); 61 println!("global Q interval: {}", num_global_queue_interval); 62 println!(" relay search: {}", num_relay_search); 63 println!(" spin stall: {}", num_spin_stall); 64 println!(" no local work: {}", num_no_local_work); 65 } 66 } 67 inc_num_inc_notify_local()68 pub(crate) fn inc_num_inc_notify_local() { 69 NUM_NOTIFY_LOCAL.fetch_add(1, Relaxed); 70 } 71 inc_num_notify_remote()72 pub(crate) fn inc_num_notify_remote() { 73 NUM_NOTIFY_REMOTE.fetch_add(1, Relaxed); 74 } 75 inc_num_unparks_local()76 pub(crate) fn inc_num_unparks_local() { 77 NUM_UNPARKS_LOCAL.fetch_add(1, Relaxed); 78 } 79 inc_num_unparks_remote()80 pub(crate) fn inc_num_unparks_remote() { 81 NUM_UNPARKS_REMOTE.fetch_add(1, Relaxed); 82 } 83 inc_num_maintenance()84 pub(crate) fn inc_num_maintenance() { 85 NUM_MAINTENANCE.fetch_add(1, Relaxed); 86 } 87 inc_lifo_schedules()88 pub(crate) fn inc_lifo_schedules() { 89 NUM_LIFO_SCHEDULES.fetch_add(1, Relaxed); 90 } 91 inc_lifo_capped()92 pub(crate) fn inc_lifo_capped() { 93 NUM_LIFO_CAPPED.fetch_add(1, Relaxed); 94 } 95 inc_num_steals()96 pub(crate) fn inc_num_steals() { 97 NUM_STEALS.fetch_add(1, Relaxed); 98 } 99 inc_num_overflows()100 pub(crate) fn inc_num_overflows() { 101 NUM_OVERFLOW.fetch_add(1, Relaxed); 102 } 103 inc_num_parks()104 pub(crate) fn inc_num_parks() { 105 NUM_PARK.fetch_add(1, Relaxed); 106 } 107 inc_num_polls()108 pub(crate) fn inc_num_polls() { 109 NUM_POLLS.fetch_add(1, Relaxed); 110 } 111 inc_num_lifo_polls()112 pub(crate) fn inc_num_lifo_polls() { 113 NUM_LIFO_POLLS.fetch_add(1, Relaxed); 114 } 115 inc_num_remote_batch()116 pub(crate) fn inc_num_remote_batch() { 117 NUM_REMOTE_BATCH.fetch_add(1, Relaxed); 118 } 119 inc_global_queue_interval()120 pub(crate) fn inc_global_queue_interval() { 121 NUM_GLOBAL_QUEUE_INTERVAL.fetch_add(1, Relaxed); 122 } 123 inc_notify_no_core()124 pub(crate) fn inc_notify_no_core() { 125 NUM_NO_AVAIL_CORE.fetch_add(1, Relaxed); 126 } 127 inc_num_relay_search()128 pub(crate) fn inc_num_relay_search() { 129 NUM_RELAY_SEARCH.fetch_add(1, Relaxed); 130 } 131 inc_num_spin_stall()132 pub(crate) fn inc_num_spin_stall() { 133 NUM_SPIN_STALL.fetch_add(1, Relaxed); 134 } 135 inc_num_no_local_work()136 pub(crate) fn inc_num_no_local_work() { 137 NUM_NO_LOCAL_WORK.fetch_add(1, Relaxed); 138 } 139 } 140 141 #[cfg(not(tokio_internal_mt_counters))] 142 mod imp { inc_num_inc_notify_local()143 pub(crate) fn inc_num_inc_notify_local() {} inc_num_notify_remote()144 pub(crate) fn inc_num_notify_remote() {} inc_num_unparks_local()145 pub(crate) fn inc_num_unparks_local() {} inc_num_unparks_remote()146 pub(crate) fn inc_num_unparks_remote() {} inc_num_maintenance()147 pub(crate) fn inc_num_maintenance() {} inc_lifo_schedules()148 pub(crate) fn inc_lifo_schedules() {} inc_lifo_capped()149 pub(crate) fn inc_lifo_capped() {} inc_num_steals()150 pub(crate) fn inc_num_steals() {} inc_num_overflows()151 pub(crate) fn inc_num_overflows() {} inc_num_parks()152 pub(crate) fn inc_num_parks() {} inc_num_polls()153 pub(crate) fn inc_num_polls() {} inc_num_lifo_polls()154 pub(crate) fn inc_num_lifo_polls() {} inc_num_remote_batch()155 pub(crate) fn inc_num_remote_batch() {} inc_global_queue_interval()156 pub(crate) fn inc_global_queue_interval() {} inc_notify_no_core()157 pub(crate) fn inc_notify_no_core() {} inc_num_relay_search()158 pub(crate) fn inc_num_relay_search() {} inc_num_spin_stall()159 pub(crate) fn inc_num_spin_stall() {} inc_num_no_local_work()160 pub(crate) fn inc_num_no_local_work() {} 161 } 162 163 #[derive(Debug)] 164 pub(crate) struct Counters; 165 166 pub(super) use imp::*; 167