crossbeam-channel/src/utils.rs
Line | Count | Source (jump to first uncovered line) |
1 | | //! Miscellaneous utilities. |
2 | | |
3 | | use std::cell::{Cell, UnsafeCell}; |
4 | | use std::num::Wrapping; |
5 | | use std::ops::{Deref, DerefMut}; |
6 | | use std::sync::atomic::{AtomicBool, Ordering}; |
7 | | use std::thread; |
8 | | use std::time::{Duration, Instant}; |
9 | | |
10 | | use crossbeam_utils::Backoff; |
11 | | |
12 | | /// Randomly shuffles a slice. |
13 | 10.0M | pub(crate) fn shuffle<T>(v: &mut [T]) { |
14 | 10.0M | let len = v.len(); |
15 | 10.0M | if len <= 1 { |
16 | 8.43M | return; |
17 | 1.65M | } |
18 | 1.65M | |
19 | 1.65M | thread_local! { |
20 | 1.65M | static RNG: Cell<Wrapping<u32>> = Cell::new(Wrapping(1_406_868_647)); |
21 | 1.65M | } |
22 | 1.65M | |
23 | 1.68M | let _ = RNG.try_with(|rng| { |
24 | 3.29M | for i in 1..len1.68M { |
25 | 3.29M | // This is the 32-bit variant of Xorshift. |
26 | 3.29M | // |
27 | 3.29M | // Source: https://en.wikipedia.org/wiki/Xorshift |
28 | 3.29M | let mut x = rng.get(); |
29 | 3.29M | x ^= x << 13; |
30 | 3.29M | x ^= x >> 17; |
31 | 3.29M | x ^= x << 5; |
32 | 3.29M | rng.set(x); |
33 | 3.29M | |
34 | 3.29M | let x = x.0; |
35 | 3.29M | let n = i + 1; |
36 | 3.29M | |
37 | 3.29M | // This is a fast alternative to `let j = x % n`. |
38 | 3.29M | // |
39 | 3.29M | // Author: Daniel Lemire |
40 | 3.29M | // Source: https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/ |
41 | 3.29M | let j = ((x as u64).wrapping_mul(n as u64) >> 32) as u32 as usize; |
42 | 3.29M | |
43 | 3.29M | v.swap(i, j); |
44 | 3.29M | } |
45 | 1.68M | })1.65M ; |
46 | 10.0M | } |
47 | | |
48 | | /// Sleeps until the deadline, or forever if the deadline isn't specified. |
49 | 10 | pub(crate) fn sleep_until(deadline: Option<Instant>) { |
50 | 10 | loop { |
51 | 10 | match deadline { |
52 | 10 | None => thread::sleep(Duration::from_secs(1000))0 , |
53 | 10 | Some(d) => { |
54 | 10 | let now = Instant::now(); |
55 | 10 | if now >= d { |
56 | 0 | break; |
57 | 10 | } |
58 | 10 | thread::sleep(d - now); |
59 | | } |
60 | | } |
61 | | } |
62 | 0 | } |
63 | | |
64 | | /// A simple spinlock. |
65 | | pub(crate) struct Spinlock<T> { |
66 | | flag: AtomicBool, |
67 | | value: UnsafeCell<T>, |
68 | | } |
69 | | |
70 | | impl<T> Spinlock<T> { |
71 | | /// Returns a new spinlock initialized with `value`. |
72 | 83.2k | pub(crate) fn new(value: T) -> Spinlock<T> { |
73 | 83.2k | Spinlock { |
74 | 83.2k | flag: AtomicBool::new(false), |
75 | 83.2k | value: UnsafeCell::new(value), |
76 | 83.2k | } |
77 | 83.2k | } <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::new Line | Count | Source | 72 | 1.11k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 1.11k | Spinlock { | 74 | 1.11k | flag: AtomicBool::new(false), | 75 | 1.11k | value: UnsafeCell::new(value), | 76 | 1.11k | } | 77 | 1.11k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 20.0k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 20.0k | Spinlock { | 74 | 20.0k | flag: AtomicBool::new(false), | 75 | 20.0k | value: UnsafeCell::new(value), | 76 | 20.0k | } | 77 | 20.0k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::new Line | Count | Source | 72 | 1.08k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 1.08k | Spinlock { | 74 | 1.08k | flag: AtomicBool::new(false), | 75 | 1.08k | value: UnsafeCell::new(value), | 76 | 1.08k | } | 77 | 1.08k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 4.06k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 4.06k | Spinlock { | 74 | 4.06k | flag: AtomicBool::new(false), | 75 | 4.06k | value: UnsafeCell::new(value), | 76 | 4.06k | } | 77 | 4.06k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 537 | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 537 | Spinlock { | 74 | 537 | flag: AtomicBool::new(false), | 75 | 537 | value: UnsafeCell::new(value), | 76 | 537 | } | 77 | 537 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::new Line | Count | Source | 72 | 42 | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 42 | Spinlock { | 74 | 42 | flag: AtomicBool::new(false), | 75 | 42 | value: UnsafeCell::new(value), | 76 | 42 | } | 77 | 42 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 22.2k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 22.2k | Spinlock { | 74 | 22.2k | flag: AtomicBool::new(false), | 75 | 22.2k | value: UnsafeCell::new(value), | 76 | 22.2k | } | 77 | 22.2k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 6 | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 6 | Spinlock { | 74 | 6 | flag: AtomicBool::new(false), | 75 | 6 | value: UnsafeCell::new(value), | 76 | 6 | } | 77 | 6 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 1 | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 1 | Spinlock { | 74 | 1 | flag: AtomicBool::new(false), | 75 | 1 | value: UnsafeCell::new(value), | 76 | 1 | } | 77 | 1 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 7 | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 7 | Spinlock { | 74 | 7 | flag: AtomicBool::new(false), | 75 | 7 | value: UnsafeCell::new(value), | 76 | 7 | } | 77 | 7 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::new Line | Count | Source | 72 | 3 | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 3 | Spinlock { | 74 | 3 | flag: AtomicBool::new(false), | 75 | 3 | value: UnsafeCell::new(value), | 76 | 3 | } | 77 | 3 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 2 | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 2 | Spinlock { | 74 | 2 | flag: AtomicBool::new(false), | 75 | 2 | value: UnsafeCell::new(value), | 76 | 2 | } | 77 | 2 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 11.1k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 11.1k | Spinlock { | 74 | 11.1k | flag: AtomicBool::new(false), | 75 | 11.1k | value: UnsafeCell::new(value), | 76 | 11.1k | } | 77 | 11.1k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::new Line | Count | Source | 72 | 1.44k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 1.44k | Spinlock { | 74 | 1.44k | flag: AtomicBool::new(false), | 75 | 1.44k | value: UnsafeCell::new(value), | 76 | 1.44k | } | 77 | 1.44k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 10.3k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 10.3k | Spinlock { | 74 | 10.3k | flag: AtomicBool::new(false), | 75 | 10.3k | value: UnsafeCell::new(value), | 76 | 10.3k | } | 77 | 10.3k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 4.07k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 4.07k | Spinlock { | 74 | 4.07k | flag: AtomicBool::new(false), | 75 | 4.07k | value: UnsafeCell::new(value), | 76 | 4.07k | } | 77 | 4.07k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::new Line | Count | Source | 72 | 1.09k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 1.09k | Spinlock { | 74 | 1.09k | flag: AtomicBool::new(false), | 75 | 1.09k | value: UnsafeCell::new(value), | 76 | 1.09k | } | 77 | 1.09k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::new Line | Count | Source | 72 | 13 | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 13 | Spinlock { | 74 | 13 | flag: AtomicBool::new(false), | 75 | 13 | value: UnsafeCell::new(value), | 76 | 13 | } | 77 | 13 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::new Line | Count | Source | 72 | 6.04k | pub(crate) fn new(value: T) -> Spinlock<T> { | 73 | 6.04k | Spinlock { | 74 | 6.04k | flag: AtomicBool::new(false), | 75 | 6.04k | value: UnsafeCell::new(value), | 76 | 6.04k | } | 77 | 6.04k | } |
|
78 | | |
79 | | /// Locks the spinlock. |
80 | 96.9M | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { |
81 | 96.9M | let backoff = Backoff::new(); |
82 | 108M | while self.flag.swap(true, Ordering::Acquire) { |
83 | 11.2M | backoff.snooze(); |
84 | 11.2M | } |
85 | 96.9M | SpinlockGuard { parent: self } |
86 | 96.9M | } <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Line | Count | Source | 80 | 929k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 929k | let backoff = Backoff::new(); | 82 | 2.21M | while self.flag.swap(true, Ordering::Acquire) { | 83 | 1.28M | backoff.snooze(); | 84 | 1.28M | } | 85 | 929k | SpinlockGuard { parent: self } | 86 | 929k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 20.9k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 20.9k | let backoff = Backoff::new(); | 82 | 21.1k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 104 | backoff.snooze(); | 84 | 104 | } | 85 | 20.9k | SpinlockGuard { parent: self } | 86 | 20.9k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Line | Count | Source | 80 | 23.0M | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 23.0M | let backoff = Backoff::new(); | 82 | 29.3M | while self.flag.swap(true, Ordering::Acquire) { | 83 | 6.25M | backoff.snooze(); | 84 | 6.25M | } | 85 | 23.0M | SpinlockGuard { parent: self } | 86 | 23.0M | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 9.03k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 9.03k | let backoff = Backoff::new(); | 82 | 10.5k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 1.48k | backoff.snooze(); | 84 | 1.48k | } | 85 | 9.03k | SpinlockGuard { parent: self } | 86 | 9.03k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 27.2k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 27.2k | let backoff = Backoff::new(); | 82 | 30.0k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 2.80k | backoff.snooze(); | 84 | 2.80k | } | 85 | 27.2k | SpinlockGuard { parent: self } | 86 | 27.2k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Line | Count | Source | 80 | 68.6k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 68.6k | let backoff = Backoff::new(); | 82 | 171k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 103k | backoff.snooze(); | 84 | 103k | } | 85 | 68.6k | SpinlockGuard { parent: self } | 86 | 68.6k | } |
Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock <crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 23.8k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 23.8k | let backoff = Backoff::new(); | 82 | 24.0k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 228 | backoff.snooze(); | 84 | 228 | } | 85 | 23.8k | SpinlockGuard { parent: self } | 86 | 23.8k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 12 | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 12 | let backoff = Backoff::new(); | 82 | 12 | while self.flag.swap(true, Ordering::Acquire) { | 83 | 0 | backoff.snooze(); | 84 | 0 | } | 85 | 12 | SpinlockGuard { parent: self } | 86 | 12 | } |
Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock <crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 1 | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 1 | let backoff = Backoff::new(); | 82 | 1 | while self.flag.swap(true, Ordering::Acquire) { | 83 | 0 | backoff.snooze(); | 84 | 0 | } | 85 | 1 | SpinlockGuard { parent: self } | 86 | 1 | } |
Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock <crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 7 | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 7 | let backoff = Backoff::new(); | 82 | 7 | while self.flag.swap(true, Ordering::Acquire) { | 83 | 0 | backoff.snooze(); | 84 | 0 | } | 85 | 7 | SpinlockGuard { parent: self } | 86 | 7 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Line | Count | Source | 80 | 6 | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 6 | let backoff = Backoff::new(); | 82 | 6 | while self.flag.swap(true, Ordering::Acquire) { | 83 | 0 | backoff.snooze(); | 84 | 0 | } | 85 | 6 | SpinlockGuard { parent: self } | 86 | 6 | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 2 | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 2 | let backoff = Backoff::new(); | 82 | 2 | while self.flag.swap(true, Ordering::Acquire) { | 83 | 0 | backoff.snooze(); | 84 | 0 | } | 85 | 2 | SpinlockGuard { parent: self } | 86 | 2 | } |
Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock <crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 15.1k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 15.1k | let backoff = Backoff::new(); | 82 | 15.6k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 531 | backoff.snooze(); | 84 | 531 | } | 85 | 15.1k | SpinlockGuard { parent: self } | 86 | 15.1k | } |
Unexecuted instantiation: <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock <crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Line | Count | Source | 80 | 355k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 355k | let backoff = Backoff::new(); | 82 | 450k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 95.1k | backoff.snooze(); | 84 | 95.1k | } | 85 | 355k | SpinlockGuard { parent: self } | 86 | 355k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 125k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 125k | let backoff = Backoff::new(); | 82 | 169k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 44.1k | backoff.snooze(); | 84 | 44.1k | } | 85 | 125k | SpinlockGuard { parent: self } | 86 | 125k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 29.1k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 29.1k | let backoff = Backoff::new(); | 82 | 30.8k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 1.62k | backoff.snooze(); | 84 | 1.62k | } | 85 | 29.1k | SpinlockGuard { parent: self } | 86 | 29.1k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Line | Count | Source | 80 | 71.9M | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 71.9M | let backoff = Backoff::new(); | 82 | 75.3M | while self.flag.swap(true, Ordering::Acquire) { | 83 | 3.40M | backoff.snooze(); | 84 | 3.40M | } | 85 | 71.9M | SpinlockGuard { parent: self } | 86 | 71.9M | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::waker::Waker>>::lock Line | Count | Source | 80 | 6.08k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 6.08k | let backoff = Backoff::new(); | 82 | 6.08k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 1 | backoff.snooze(); | 84 | 1 | } | 85 | 6.08k | SpinlockGuard { parent: self } | 86 | 6.08k | } |
<crossbeam_channel::utils::Spinlock<crossbeam_channel::flavors::zero::Inner>>::lock Line | Count | Source | 80 | 314k | pub(crate) fn lock(&self) -> SpinlockGuard<'_, T> { | 81 | 314k | let backoff = Backoff::new(); | 82 | 392k | while self.flag.swap(true, Ordering::Acquire) { | 83 | 78.3k | backoff.snooze(); | 84 | 78.3k | } | 85 | 314k | SpinlockGuard { parent: self } | 86 | 314k | } |
|
87 | | } |
88 | | |
89 | | /// A guard holding a spinlock locked. |
90 | | pub(crate) struct SpinlockGuard<'a, T> { |
91 | | parent: &'a Spinlock<T>, |
92 | | } |
93 | | |
94 | | impl<T> Drop for SpinlockGuard<'_, T> { |
95 | 102M | fn drop(&mut self) { |
96 | 102M | self.parent.flag.store(false, Ordering::Release); |
97 | 102M | } <crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 20.9k | fn drop(&mut self) { | 96 | 20.9k | self.parent.flag.store(false, Ordering::Release); | 97 | 20.9k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 937k | fn drop(&mut self) { | 96 | 937k | self.parent.flag.store(false, Ordering::Release); | 97 | 937k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 9.11k | fn drop(&mut self) { | 96 | 9.11k | self.parent.flag.store(false, Ordering::Release); | 97 | 9.11k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 24.1M | fn drop(&mut self) { | 96 | 24.1M | self.parent.flag.store(false, Ordering::Release); | 97 | 24.1M | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 27.2k | fn drop(&mut self) { | 96 | 27.2k | self.parent.flag.store(false, Ordering::Release); | 97 | 27.2k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 68.8k | fn drop(&mut self) { | 96 | 68.8k | self.parent.flag.store(false, Ordering::Release); | 97 | 68.8k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 23.8k | fn drop(&mut self) { | 96 | 23.8k | self.parent.flag.store(false, Ordering::Release); | 97 | 23.8k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 12 | fn drop(&mut self) { | 96 | 12 | self.parent.flag.store(false, Ordering::Release); | 97 | 12 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 1 | fn drop(&mut self) { | 96 | 1 | self.parent.flag.store(false, Ordering::Release); | 97 | 1 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 7 | fn drop(&mut self) { | 96 | 7 | self.parent.flag.store(false, Ordering::Release); | 97 | 7 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 6 | fn drop(&mut self) { | 96 | 6 | self.parent.flag.store(false, Ordering::Release); | 97 | 6 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 2 | fn drop(&mut self) { | 96 | 2 | self.parent.flag.store(false, Ordering::Release); | 97 | 2 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 15.1k | fn drop(&mut self) { | 96 | 15.1k | self.parent.flag.store(false, Ordering::Release); | 97 | 15.1k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 126k | fn drop(&mut self) { | 96 | 126k | self.parent.flag.store(false, Ordering::Release); | 97 | 126k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 358k | fn drop(&mut self) { | 96 | 358k | self.parent.flag.store(false, Ordering::Release); | 97 | 358k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 29.3k | fn drop(&mut self) { | 96 | 29.3k | self.parent.flag.store(false, Ordering::Release); | 97 | 29.3k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 76.7M | fn drop(&mut self) { | 96 | 76.7M | self.parent.flag.store(false, Ordering::Release); | 97 | 76.7M | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 6.08k | fn drop(&mut self) { | 96 | 6.08k | self.parent.flag.store(false, Ordering::Release); | 97 | 6.08k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::drop::Drop>::drop Line | Count | Source | 95 | 323k | fn drop(&mut self) { | 96 | 323k | self.parent.flag.store(false, Ordering::Release); | 97 | 323k | } |
|
98 | | } |
99 | | |
100 | | impl<T> Deref for SpinlockGuard<'_, T> { |
101 | | type Target = T; |
102 | | |
103 | 102M | fn deref(&self) -> &T { |
104 | 102M | unsafe { &*self.parent.value.get() } |
105 | 102M | } <crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 566k | fn deref(&self) -> &T { | 104 | 566k | unsafe { &*self.parent.value.get() } | 105 | 566k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 41.4k | fn deref(&self) -> &T { | 104 | 41.4k | unsafe { &*self.parent.value.get() } | 105 | 41.4k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 15.5k | fn deref(&self) -> &T { | 104 | 15.5k | unsafe { &*self.parent.value.get() } | 105 | 15.5k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 23.5M | fn deref(&self) -> &T { | 104 | 23.5M | unsafe { &*self.parent.value.get() } | 105 | 23.5M | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 41.6k | fn deref(&self) -> &T { | 104 | 41.6k | unsafe { &*self.parent.value.get() } | 105 | 41.6k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 34.8k | fn deref(&self) -> &T { | 104 | 34.8k | unsafe { &*self.parent.value.get() } | 105 | 34.8k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 46.7k | fn deref(&self) -> &T { | 104 | 46.7k | unsafe { &*self.parent.value.get() } | 105 | 46.7k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 21 | fn deref(&self) -> &T { | 104 | 21 | unsafe { &*self.parent.value.get() } | 105 | 21 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 2 | fn deref(&self) -> &T { | 104 | 2 | unsafe { &*self.parent.value.get() } | 105 | 2 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 14 | fn deref(&self) -> &T { | 104 | 14 | unsafe { &*self.parent.value.get() } | 105 | 14 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 6 | fn deref(&self) -> &T { | 104 | 6 | unsafe { &*self.parent.value.get() } | 105 | 6 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 4 | fn deref(&self) -> &T { | 104 | 4 | unsafe { &*self.parent.value.get() } | 105 | 4 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 28.0k | fn deref(&self) -> &T { | 104 | 28.0k | unsafe { &*self.parent.value.get() } | 105 | 28.0k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 163k | fn deref(&self) -> &T { | 104 | 163k | unsafe { &*self.parent.value.get() } | 105 | 163k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 280k | fn deref(&self) -> &T { | 104 | 280k | unsafe { &*self.parent.value.get() } | 105 | 280k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 46.2k | fn deref(&self) -> &T { | 104 | 46.2k | unsafe { &*self.parent.value.get() } | 105 | 46.2k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 77.8M | fn deref(&self) -> &T { | 104 | 77.8M | unsafe { &*self.parent.value.get() } | 105 | 77.8M | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 12.1k | fn deref(&self) -> &T { | 104 | 12.1k | unsafe { &*self.parent.value.get() } | 105 | 12.1k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::Deref>::deref Line | Count | Source | 103 | 319k | fn deref(&self) -> &T { | 104 | 319k | unsafe { &*self.parent.value.get() } | 105 | 319k | } |
|
106 | | } |
107 | | |
108 | | impl<T> DerefMut for SpinlockGuard<'_, T> { |
109 | 117M | fn deref_mut(&mut self) -> &mut T { |
110 | 117M | unsafe { &mut *self.parent.value.get() } |
111 | 117M | } <crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 21.1k | fn deref_mut(&mut self) -> &mut T { | 110 | 21.1k | unsafe { &mut *self.parent.value.get() } | 111 | 21.1k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 1.69M | fn deref_mut(&mut self) -> &mut T { | 110 | 1.69M | unsafe { &mut *self.parent.value.get() } | 111 | 1.69M | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 31.1M | fn deref_mut(&mut self) -> &mut T { | 110 | 31.1M | unsafe { &mut *self.parent.value.get() } | 111 | 31.1M | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 9.77k | fn deref_mut(&mut self) -> &mut T { | 110 | 9.77k | unsafe { &mut *self.parent.value.get() } | 111 | 9.77k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 134k | fn deref_mut(&mut self) -> &mut T { | 110 | 134k | unsafe { &mut *self.parent.value.get() } | 111 | 134k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 29.6k | fn deref_mut(&mut self) -> &mut T { | 110 | 29.6k | unsafe { &mut *self.parent.value.get() } | 111 | 29.6k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 24.1k | fn deref_mut(&mut self) -> &mut T { | 110 | 24.1k | unsafe { &mut *self.parent.value.get() } | 111 | 24.1k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 14 | fn deref_mut(&mut self) -> &mut T { | 110 | 14 | unsafe { &mut *self.parent.value.get() } | 111 | 14 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 1 | fn deref_mut(&mut self) -> &mut T { | 110 | 1 | unsafe { &mut *self.parent.value.get() } | 111 | 1 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 9 | fn deref_mut(&mut self) -> &mut T { | 110 | 9 | unsafe { &mut *self.parent.value.get() } | 111 | 9 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 7 | fn deref_mut(&mut self) -> &mut T { | 110 | 7 | unsafe { &mut *self.parent.value.get() } | 111 | 7 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 2 | fn deref_mut(&mut self) -> &mut T { | 110 | 2 | unsafe { &mut *self.parent.value.get() } | 111 | 2 | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 15.6k | fn deref_mut(&mut self) -> &mut T { | 110 | 15.6k | unsafe { &mut *self.parent.value.get() } | 111 | 15.6k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 518k | fn deref_mut(&mut self) -> &mut T { | 110 | 518k | unsafe { &mut *self.parent.value.get() } | 111 | 518k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 167k | fn deref_mut(&mut self) -> &mut T { | 110 | 167k | unsafe { &mut *self.parent.value.get() } | 111 | 167k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 83.5M | fn deref_mut(&mut self) -> &mut T { | 110 | 83.5M | unsafe { &mut *self.parent.value.get() } | 111 | 83.5M | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 30.4k | fn deref_mut(&mut self) -> &mut T { | 110 | 30.4k | unsafe { &mut *self.parent.value.get() } | 111 | 30.4k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::flavors::zero::Inner> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 346k | fn deref_mut(&mut self) -> &mut T { | 110 | 346k | unsafe { &mut *self.parent.value.get() } | 111 | 346k | } |
<crossbeam_channel::utils::SpinlockGuard<crossbeam_channel::waker::Waker> as core::ops::deref::DerefMut>::deref_mut Line | Count | Source | 109 | 6.09k | fn deref_mut(&mut self) -> &mut T { | 110 | 6.09k | unsafe { &mut *self.parent.value.get() } | 111 | 6.09k | } |
|
112 | | } |