@@ -75,3 +75,43 @@ impl<const N: usize> WakeDataContainer for WakerArrayInner<N> {
75
75
}
76
76
}
77
77
}
78
+
79
+ #[ cfg( test) ]
80
+ mod tests {
81
+ use crate :: utils:: wakers:: dummy_waker;
82
+
83
+ use super :: * ;
84
+ #[ test]
85
+ fn check_refcount ( ) {
86
+ let mut wa = WakerArray :: < 5 > :: new ( ) ;
87
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 6 ) ;
88
+ wa. wakers [ 4 ] = dummy_waker ( ) ;
89
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 5 ) ;
90
+ let cloned = wa. wakers [ 3 ] . clone ( ) ;
91
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 6 ) ;
92
+ wa. wakers [ 3 ] = wa. wakers [ 4 ] . clone ( ) ;
93
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 5 ) ;
94
+ drop ( cloned) ;
95
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 4 ) ;
96
+
97
+ wa. wakers [ 0 ] . wake_by_ref ( ) ;
98
+ wa. wakers [ 0 ] . wake_by_ref ( ) ;
99
+ wa. wakers [ 0 ] . wake_by_ref ( ) ;
100
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 4 ) ;
101
+
102
+ wa. wakers [ 0 ] = wa. wakers [ 1 ] . clone ( ) ;
103
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 4 ) ;
104
+
105
+ let taken = std:: mem:: replace ( & mut wa. wakers [ 2 ] , dummy_waker ( ) ) ;
106
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 4 ) ;
107
+ taken. wake_by_ref ( ) ;
108
+ taken. wake_by_ref ( ) ;
109
+ taken. wake_by_ref ( ) ;
110
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 4 ) ;
111
+ taken. wake ( ) ;
112
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 3 ) ;
113
+
114
+ wa. wakers = array:: from_fn ( |_| dummy_waker ( ) ) ;
115
+ assert_eq ! ( Arc :: strong_count( & wa. inner) , 1 ) ;
116
+ }
117
+ }
0 commit comments