@@ -6,28 +6,9 @@ use std::sync::mpsc::channel;
6
6
use std:: sync:: { Arc , Condvar , MappedMutexGuard , Mutex , MutexGuard , TryLockError } ;
7
7
use std:: { hint, mem, thread} ;
8
8
9
- struct Packet < T > ( Arc < ( Mutex < T > , Condvar ) > ) ;
10
-
11
- #[ derive( Eq , PartialEq , Debug ) ]
12
- struct NonCopy ( i32 ) ;
13
-
14
- #[ derive( Eq , PartialEq , Debug ) ]
15
- struct NonCopyNeedsDrop ( i32 ) ;
16
-
17
- impl Drop for NonCopyNeedsDrop {
18
- fn drop ( & mut self ) {
19
- hint:: black_box ( ( ) ) ;
20
- }
21
- }
22
-
23
- #[ test]
24
- fn test_needs_drop ( ) {
25
- assert ! ( !mem:: needs_drop:: <NonCopy >( ) ) ;
26
- assert ! ( mem:: needs_drop:: <NonCopyNeedsDrop >( ) ) ;
27
- }
28
-
29
- #[ derive( Clone , Eq , PartialEq , Debug ) ]
30
- struct Cloneable ( i32 ) ;
9
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
10
+ // Nonpoison & Poison Tests
11
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
31
12
32
13
#[ test]
33
14
fn smoke ( ) {
@@ -78,19 +59,22 @@ fn try_lock() {
78
59
* m. try_lock ( ) . unwrap ( ) = ( ) ;
79
60
}
80
61
81
- fn new_poisoned_mutex < T > ( value : T ) -> Mutex < T > {
82
- let mutex = Mutex :: new ( value) ;
83
-
84
- let catch_unwind_result = panic:: catch_unwind ( AssertUnwindSafe ( || {
85
- let _guard = mutex. lock ( ) . unwrap ( ) ;
62
+ #[ derive( Eq , PartialEq , Debug ) ]
63
+ struct NonCopy ( i32 ) ;
86
64
87
- panic ! ( "test panic to poison mutex" ) ;
88
- } ) ) ;
65
+ # [ derive ( Eq , PartialEq , Debug ) ]
66
+ struct NonCopyNeedsDrop ( i32 ) ;
89
67
90
- assert ! ( catch_unwind_result. is_err( ) ) ;
91
- assert ! ( mutex. is_poisoned( ) ) ;
68
+ impl Drop for NonCopyNeedsDrop {
69
+ fn drop ( & mut self ) {
70
+ hint:: black_box ( ( ) ) ;
71
+ }
72
+ }
92
73
93
- mutex
74
+ #[ test]
75
+ fn test_needs_drop ( ) {
76
+ assert ! ( !mem:: needs_drop:: <NonCopy >( ) ) ;
77
+ assert ! ( mem:: needs_drop:: <NonCopyNeedsDrop >( ) ) ;
94
78
}
95
79
96
80
#[ test]
@@ -117,6 +101,143 @@ fn test_into_inner_drop() {
117
101
assert_eq ! ( num_drops. load( Ordering :: SeqCst ) , 1 ) ;
118
102
}
119
103
104
+ #[ test]
105
+ fn test_get_mut ( ) {
106
+ let mut m = Mutex :: new ( NonCopy ( 10 ) ) ;
107
+ * m. get_mut ( ) . unwrap ( ) = NonCopy ( 20 ) ;
108
+ assert_eq ! ( m. into_inner( ) . unwrap( ) , NonCopy ( 20 ) ) ;
109
+ }
110
+
111
+ #[ test]
112
+ fn test_get_cloned ( ) {
113
+ #[ derive( Clone , Eq , PartialEq , Debug ) ]
114
+ struct Cloneable ( i32 ) ;
115
+
116
+ let m = Mutex :: new ( Cloneable ( 10 ) ) ;
117
+
118
+ assert_eq ! ( m. get_cloned( ) . unwrap( ) , Cloneable ( 10 ) ) ;
119
+ }
120
+
121
+ #[ test]
122
+ fn test_set ( ) {
123
+ fn inner < T > ( mut init : impl FnMut ( ) -> T , mut value : impl FnMut ( ) -> T )
124
+ where
125
+ T : Debug + Eq ,
126
+ {
127
+ let m = Mutex :: new ( init ( ) ) ;
128
+
129
+ assert_eq ! ( * m. lock( ) . unwrap( ) , init( ) ) ;
130
+ m. set ( value ( ) ) . unwrap ( ) ;
131
+ assert_eq ! ( * m. lock( ) . unwrap( ) , value( ) ) ;
132
+ }
133
+
134
+ inner ( || NonCopy ( 10 ) , || NonCopy ( 20 ) ) ;
135
+ inner ( || NonCopyNeedsDrop ( 10 ) , || NonCopyNeedsDrop ( 20 ) ) ;
136
+ }
137
+
138
+ #[ test]
139
+ fn test_replace ( ) {
140
+ fn inner < T > ( mut init : impl FnMut ( ) -> T , mut value : impl FnMut ( ) -> T )
141
+ where
142
+ T : Debug + Eq ,
143
+ {
144
+ let m = Mutex :: new ( init ( ) ) ;
145
+
146
+ assert_eq ! ( * m. lock( ) . unwrap( ) , init( ) ) ;
147
+ assert_eq ! ( m. replace( value( ) ) . unwrap( ) , init( ) ) ;
148
+ assert_eq ! ( * m. lock( ) . unwrap( ) , value( ) ) ;
149
+ }
150
+
151
+ inner ( || NonCopy ( 10 ) , || NonCopy ( 20 ) ) ;
152
+ inner ( || NonCopyNeedsDrop ( 10 ) , || NonCopyNeedsDrop ( 20 ) ) ;
153
+ }
154
+
155
+ #[ test]
156
+ fn test_mutex_arc_condvar ( ) {
157
+ struct Packet < T > ( Arc < ( Mutex < T > , Condvar ) > ) ;
158
+
159
+ let packet = Packet ( Arc :: new ( ( Mutex :: new ( false ) , Condvar :: new ( ) ) ) ) ;
160
+ let packet2 = Packet ( packet. 0 . clone ( ) ) ;
161
+ let ( tx, rx) = channel ( ) ;
162
+ let _t = thread:: spawn ( move || {
163
+ // wait until parent gets in
164
+ rx. recv ( ) . unwrap ( ) ;
165
+ let & ( ref lock, ref cvar) = & * packet2. 0 ;
166
+ let mut lock = lock. lock ( ) . unwrap ( ) ;
167
+ * lock = true ;
168
+ cvar. notify_one ( ) ;
169
+ } ) ;
170
+
171
+ let & ( ref lock, ref cvar) = & * packet. 0 ;
172
+ let mut lock = lock. lock ( ) . unwrap ( ) ;
173
+ tx. send ( ( ) ) . unwrap ( ) ;
174
+ assert ! ( !* lock) ;
175
+ while !* lock {
176
+ lock = cvar. wait ( lock) . unwrap ( ) ;
177
+ }
178
+ }
179
+
180
+ #[ test]
181
+ fn test_mutex_arc_nested ( ) {
182
+ // Tests nested mutexes and access
183
+ // to underlying data.
184
+ let arc = Arc :: new ( Mutex :: new ( 1 ) ) ;
185
+ let arc2 = Arc :: new ( Mutex :: new ( arc) ) ;
186
+ let ( tx, rx) = channel ( ) ;
187
+ let _t = thread:: spawn ( move || {
188
+ let lock = arc2. lock ( ) . unwrap ( ) ;
189
+ let lock2 = lock. lock ( ) . unwrap ( ) ;
190
+ assert_eq ! ( * lock2, 1 ) ;
191
+ tx. send ( ( ) ) . unwrap ( ) ;
192
+ } ) ;
193
+ rx. recv ( ) . unwrap ( ) ;
194
+ }
195
+
196
+ #[ test]
197
+ fn test_mutex_unsized ( ) {
198
+ let mutex: & Mutex < [ i32 ] > = & Mutex :: new ( [ 1 , 2 , 3 ] ) ;
199
+ {
200
+ let b = & mut * mutex. lock ( ) . unwrap ( ) ;
201
+ b[ 0 ] = 4 ;
202
+ b[ 2 ] = 5 ;
203
+ }
204
+ let comp: & [ i32 ] = & [ 4 , 2 , 5 ] ;
205
+ assert_eq ! ( & * mutex. lock( ) . unwrap( ) , comp) ;
206
+ }
207
+
208
+ #[ test]
209
+ fn test_mapping_mapped_guard ( ) {
210
+ let arr = [ 0 ; 4 ] ;
211
+ let mut lock = Mutex :: new ( arr) ;
212
+ let guard = lock. lock ( ) . unwrap ( ) ;
213
+ let guard = MutexGuard :: map ( guard, |arr| & mut arr[ ..2 ] ) ;
214
+ let mut guard = MappedMutexGuard :: map ( guard, |slice| & mut slice[ 1 ..] ) ;
215
+ assert_eq ! ( guard. len( ) , 1 ) ;
216
+ guard[ 0 ] = 42 ;
217
+ drop ( guard) ;
218
+ assert_eq ! ( * lock. get_mut( ) . unwrap( ) , [ 0 , 42 , 0 , 0 ] ) ;
219
+ }
220
+
221
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
222
+ // Poison Tests
223
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
224
+
225
+ /// Creates a mutex that is immediately poisoned.
226
+ fn new_poisoned_mutex < T > ( value : T ) -> Mutex < T > {
227
+ let mutex = Mutex :: new ( value) ;
228
+
229
+ let catch_unwind_result = panic:: catch_unwind ( AssertUnwindSafe ( || {
230
+ let _guard = mutex. lock ( ) . unwrap ( ) ;
231
+
232
+ panic ! ( "test panic to poison mutex" ) ;
233
+ } ) ) ;
234
+
235
+ assert ! ( catch_unwind_result. is_err( ) ) ;
236
+ assert ! ( mutex. is_poisoned( ) ) ;
237
+
238
+ mutex
239
+ }
240
+
120
241
#[ test]
121
242
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
122
243
fn test_into_inner_poison ( ) {
@@ -128,16 +249,12 @@ fn test_into_inner_poison() {
128
249
}
129
250
}
130
251
131
- #[ test]
132
- fn test_get_cloned ( ) {
133
- let m = Mutex :: new ( Cloneable ( 10 ) ) ;
134
-
135
- assert_eq ! ( m. get_cloned( ) . unwrap( ) , Cloneable ( 10 ) ) ;
136
- }
137
-
138
252
#[ test]
139
253
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
140
254
fn test_get_cloned_poison ( ) {
255
+ #[ derive( Clone , Eq , PartialEq , Debug ) ]
256
+ struct Cloneable ( i32 ) ;
257
+
141
258
let m = new_poisoned_mutex ( Cloneable ( 10 ) ) ;
142
259
143
260
match m. get_cloned ( ) {
@@ -146,13 +263,6 @@ fn test_get_cloned_poison() {
146
263
}
147
264
}
148
265
149
- #[ test]
150
- fn test_get_mut ( ) {
151
- let mut m = Mutex :: new ( NonCopy ( 10 ) ) ;
152
- * m. get_mut ( ) . unwrap ( ) = NonCopy ( 20 ) ;
153
- assert_eq ! ( m. into_inner( ) . unwrap( ) , NonCopy ( 20 ) ) ;
154
- }
155
-
156
266
#[ test]
157
267
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
158
268
fn test_get_mut_poison ( ) {
@@ -164,23 +274,6 @@ fn test_get_mut_poison() {
164
274
}
165
275
}
166
276
167
- #[ test]
168
- fn test_set ( ) {
169
- fn inner < T > ( mut init : impl FnMut ( ) -> T , mut value : impl FnMut ( ) -> T )
170
- where
171
- T : Debug + Eq ,
172
- {
173
- let m = Mutex :: new ( init ( ) ) ;
174
-
175
- assert_eq ! ( * m. lock( ) . unwrap( ) , init( ) ) ;
176
- m. set ( value ( ) ) . unwrap ( ) ;
177
- assert_eq ! ( * m. lock( ) . unwrap( ) , value( ) ) ;
178
- }
179
-
180
- inner ( || NonCopy ( 10 ) , || NonCopy ( 20 ) ) ;
181
- inner ( || NonCopyNeedsDrop ( 10 ) , || NonCopyNeedsDrop ( 20 ) ) ;
182
- }
183
-
184
277
#[ test]
185
278
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
186
279
fn test_set_poison ( ) {
@@ -203,23 +296,6 @@ fn test_set_poison() {
203
296
inner ( || NonCopyNeedsDrop ( 10 ) , || NonCopyNeedsDrop ( 20 ) ) ;
204
297
}
205
298
206
- #[ test]
207
- fn test_replace ( ) {
208
- fn inner < T > ( mut init : impl FnMut ( ) -> T , mut value : impl FnMut ( ) -> T )
209
- where
210
- T : Debug + Eq ,
211
- {
212
- let m = Mutex :: new ( init ( ) ) ;
213
-
214
- assert_eq ! ( * m. lock( ) . unwrap( ) , init( ) ) ;
215
- assert_eq ! ( m. replace( value( ) ) . unwrap( ) , init( ) ) ;
216
- assert_eq ! ( * m. lock( ) . unwrap( ) , value( ) ) ;
217
- }
218
-
219
- inner ( || NonCopy ( 10 ) , || NonCopy ( 20 ) ) ;
220
- inner ( || NonCopyNeedsDrop ( 10 ) , || NonCopyNeedsDrop ( 20 ) ) ;
221
- }
222
-
223
299
#[ test]
224
300
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
225
301
fn test_replace_poison ( ) {
@@ -242,32 +318,11 @@ fn test_replace_poison() {
242
318
inner ( || NonCopyNeedsDrop ( 10 ) , || NonCopyNeedsDrop ( 20 ) ) ;
243
319
}
244
320
245
- #[ test]
246
- fn test_mutex_arc_condvar ( ) {
247
- let packet = Packet ( Arc :: new ( ( Mutex :: new ( false ) , Condvar :: new ( ) ) ) ) ;
248
- let packet2 = Packet ( packet. 0 . clone ( ) ) ;
249
- let ( tx, rx) = channel ( ) ;
250
- let _t = thread:: spawn ( move || {
251
- // wait until parent gets in
252
- rx. recv ( ) . unwrap ( ) ;
253
- let & ( ref lock, ref cvar) = & * packet2. 0 ;
254
- let mut lock = lock. lock ( ) . unwrap ( ) ;
255
- * lock = true ;
256
- cvar. notify_one ( ) ;
257
- } ) ;
258
-
259
- let & ( ref lock, ref cvar) = & * packet. 0 ;
260
- let mut lock = lock. lock ( ) . unwrap ( ) ;
261
- tx. send ( ( ) ) . unwrap ( ) ;
262
- assert ! ( !* lock) ;
263
- while !* lock {
264
- lock = cvar. wait ( lock) . unwrap ( ) ;
265
- }
266
- }
267
-
268
321
#[ test]
269
322
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
270
323
fn test_arc_condvar_poison ( ) {
324
+ struct Packet < T > ( Arc < ( Mutex < T > , Condvar ) > ) ;
325
+
271
326
let packet = Packet ( Arc :: new ( ( Mutex :: new ( 1 ) , Condvar :: new ( ) ) ) ) ;
272
327
let packet2 = Packet ( packet. 0 . clone ( ) ) ;
273
328
let ( tx, rx) = channel ( ) ;
@@ -326,22 +381,6 @@ fn test_mutex_arc_poison_mapped() {
326
381
assert ! ( arc. is_poisoned( ) ) ;
327
382
}
328
383
329
- #[ test]
330
- fn test_mutex_arc_nested ( ) {
331
- // Tests nested mutexes and access
332
- // to underlying data.
333
- let arc = Arc :: new ( Mutex :: new ( 1 ) ) ;
334
- let arc2 = Arc :: new ( Mutex :: new ( arc) ) ;
335
- let ( tx, rx) = channel ( ) ;
336
- let _t = thread:: spawn ( move || {
337
- let lock = arc2. lock ( ) . unwrap ( ) ;
338
- let lock2 = lock. lock ( ) . unwrap ( ) ;
339
- assert_eq ! ( * lock2, 1 ) ;
340
- tx. send ( ( ) ) . unwrap ( ) ;
341
- } ) ;
342
- rx. recv ( ) . unwrap ( ) ;
343
- }
344
-
345
384
#[ test]
346
385
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
347
386
fn test_mutex_arc_access_in_unwind ( ) {
@@ -364,31 +403,6 @@ fn test_mutex_arc_access_in_unwind() {
364
403
assert_eq ! ( * lock, 2 ) ;
365
404
}
366
405
367
- #[ test]
368
- fn test_mutex_unsized ( ) {
369
- let mutex: & Mutex < [ i32 ] > = & Mutex :: new ( [ 1 , 2 , 3 ] ) ;
370
- {
371
- let b = & mut * mutex. lock ( ) . unwrap ( ) ;
372
- b[ 0 ] = 4 ;
373
- b[ 2 ] = 5 ;
374
- }
375
- let comp: & [ i32 ] = & [ 4 , 2 , 5 ] ;
376
- assert_eq ! ( & * mutex. lock( ) . unwrap( ) , comp) ;
377
- }
378
-
379
- #[ test]
380
- fn test_mapping_mapped_guard ( ) {
381
- let arr = [ 0 ; 4 ] ;
382
- let mut lock = Mutex :: new ( arr) ;
383
- let guard = lock. lock ( ) . unwrap ( ) ;
384
- let guard = MutexGuard :: map ( guard, |arr| & mut arr[ ..2 ] ) ;
385
- let mut guard = MappedMutexGuard :: map ( guard, |slice| & mut slice[ 1 ..] ) ;
386
- assert_eq ! ( guard. len( ) , 1 ) ;
387
- guard[ 0 ] = 42 ;
388
- drop ( guard) ;
389
- assert_eq ! ( * lock. get_mut( ) . unwrap( ) , [ 0 , 42 , 0 , 0 ] ) ;
390
- }
391
-
392
406
#[ test]
393
407
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
394
408
fn panic_while_mapping_unlocked_poison ( ) {
0 commit comments