5
5
use std:: cell:: UnsafeCell ;
6
6
use std:: marker:: PhantomData ;
7
7
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
8
+ use std:: sync:: Mutex ;
8
9
use std:: time:: Instant ;
9
10
use std:: { fmt, ptr} ;
10
11
@@ -13,7 +14,6 @@ use crossbeam_utils::Backoff;
13
14
use crate :: context:: Context ;
14
15
use crate :: err:: { RecvTimeoutError , SendTimeoutError , TryRecvError , TrySendError } ;
15
16
use crate :: select:: { Operation , SelectHandle , Selected , Token } ;
16
- use crate :: utils:: Spinlock ;
17
17
use crate :: waker:: Waker ;
18
18
19
19
/// A pointer to a packet.
@@ -95,7 +95,7 @@ struct Inner {
95
95
/// Zero-capacity channel.
96
96
pub ( crate ) struct Channel < T > {
97
97
/// Inner representation of the channel.
98
- inner : Spinlock < Inner > ,
98
+ inner : Mutex < Inner > ,
99
99
100
100
/// Indicates that dropping a `Channel<T>` may drop values of type `T`.
101
101
_marker : PhantomData < T > ,
@@ -105,7 +105,7 @@ impl<T> Channel<T> {
105
105
/// Constructs a new zero-capacity channel.
106
106
pub ( crate ) fn new ( ) -> Self {
107
107
Channel {
108
- inner : Spinlock :: new ( Inner {
108
+ inner : Mutex :: new ( Inner {
109
109
senders : Waker :: new ( ) ,
110
110
receivers : Waker :: new ( ) ,
111
111
is_disconnected : false ,
@@ -126,7 +126,7 @@ impl<T> Channel<T> {
126
126
127
127
/// Attempts to reserve a slot for sending a message.
128
128
fn start_send ( & self , token : & mut Token ) -> bool {
129
- let mut inner = self . inner . lock ( ) ;
129
+ let mut inner = self . inner . lock ( ) . unwrap ( ) ;
130
130
131
131
// If there's a waiting receiver, pair up with it.
132
132
if let Some ( operation) = inner. receivers . try_select ( ) {
@@ -155,7 +155,7 @@ impl<T> Channel<T> {
155
155
156
156
/// Attempts to pair up with a sender.
157
157
fn start_recv ( & self , token : & mut Token ) -> bool {
158
- let mut inner = self . inner . lock ( ) ;
158
+ let mut inner = self . inner . lock ( ) . unwrap ( ) ;
159
159
160
160
// If there's a waiting sender, pair up with it.
161
161
if let Some ( operation) = inner. senders . try_select ( ) {
@@ -198,7 +198,7 @@ impl<T> Channel<T> {
198
198
/// Attempts to send a message into the channel.
199
199
pub ( crate ) fn try_send ( & self , msg : T ) -> Result < ( ) , TrySendError < T > > {
200
200
let token = & mut Token :: default ( ) ;
201
- let mut inner = self . inner . lock ( ) ;
201
+ let mut inner = self . inner . lock ( ) . unwrap ( ) ;
202
202
203
203
// If there's a waiting receiver, pair up with it.
204
204
if let Some ( operation) = inner. receivers . try_select ( ) {
@@ -222,7 +222,7 @@ impl<T> Channel<T> {
222
222
deadline : Option < Instant > ,
223
223
) -> Result < ( ) , SendTimeoutError < T > > {
224
224
let token = & mut Token :: default ( ) ;
225
- let mut inner = self . inner . lock ( ) ;
225
+ let mut inner = self . inner . lock ( ) . unwrap ( ) ;
226
226
227
227
// If there's a waiting receiver, pair up with it.
228
228
if let Some ( operation) = inner. receivers . try_select ( ) {
@@ -254,12 +254,12 @@ impl<T> Channel<T> {
254
254
match sel {
255
255
Selected :: Waiting => unreachable ! ( ) ,
256
256
Selected :: Aborted => {
257
- self . inner . lock ( ) . senders . unregister ( oper) . unwrap ( ) ;
257
+ self . inner . lock ( ) . unwrap ( ) . senders . unregister ( oper) . unwrap ( ) ;
258
258
let msg = unsafe { packet. msg . get ( ) . replace ( None ) . unwrap ( ) } ;
259
259
Err ( SendTimeoutError :: Timeout ( msg) )
260
260
}
261
261
Selected :: Disconnected => {
262
- self . inner . lock ( ) . senders . unregister ( oper) . unwrap ( ) ;
262
+ self . inner . lock ( ) . unwrap ( ) . senders . unregister ( oper) . unwrap ( ) ;
263
263
let msg = unsafe { packet. msg . get ( ) . replace ( None ) . unwrap ( ) } ;
264
264
Err ( SendTimeoutError :: Disconnected ( msg) )
265
265
}
@@ -275,7 +275,7 @@ impl<T> Channel<T> {
275
275
/// Attempts to receive a message without blocking.
276
276
pub ( crate ) fn try_recv ( & self ) -> Result < T , TryRecvError > {
277
277
let token = & mut Token :: default ( ) ;
278
- let mut inner = self . inner . lock ( ) ;
278
+ let mut inner = self . inner . lock ( ) . unwrap ( ) ;
279
279
280
280
// If there's a waiting sender, pair up with it.
281
281
if let Some ( operation) = inner. senders . try_select ( ) {
@@ -292,7 +292,7 @@ impl<T> Channel<T> {
292
292
/// Receives a message from the channel.
293
293
pub ( crate ) fn recv ( & self , deadline : Option < Instant > ) -> Result < T , RecvTimeoutError > {
294
294
let token = & mut Token :: default ( ) ;
295
- let mut inner = self . inner . lock ( ) ;
295
+ let mut inner = self . inner . lock ( ) . unwrap ( ) ;
296
296
297
297
// If there's a waiting sender, pair up with it.
298
298
if let Some ( operation) = inner. senders . try_select ( ) {
@@ -325,11 +325,21 @@ impl<T> Channel<T> {
325
325
match sel {
326
326
Selected :: Waiting => unreachable ! ( ) ,
327
327
Selected :: Aborted => {
328
- self . inner . lock ( ) . receivers . unregister ( oper) . unwrap ( ) ;
328
+ self . inner
329
+ . lock ( )
330
+ . unwrap ( )
331
+ . receivers
332
+ . unregister ( oper)
333
+ . unwrap ( ) ;
329
334
Err ( RecvTimeoutError :: Timeout )
330
335
}
331
336
Selected :: Disconnected => {
332
- self . inner . lock ( ) . receivers . unregister ( oper) . unwrap ( ) ;
337
+ self . inner
338
+ . lock ( )
339
+ . unwrap ( )
340
+ . receivers
341
+ . unregister ( oper)
342
+ . unwrap ( ) ;
333
343
Err ( RecvTimeoutError :: Disconnected )
334
344
}
335
345
Selected :: Operation ( _) => {
@@ -345,7 +355,7 @@ impl<T> Channel<T> {
345
355
///
346
356
/// Returns `true` if this call disconnected the channel.
347
357
pub ( crate ) fn disconnect ( & self ) -> bool {
348
- let mut inner = self . inner . lock ( ) ;
358
+ let mut inner = self . inner . lock ( ) . unwrap ( ) ;
349
359
350
360
if !inner. is_disconnected {
351
361
inner. is_disconnected = true ;
@@ -396,7 +406,7 @@ impl<T> SelectHandle for Receiver<'_, T> {
396
406
fn register ( & self , oper : Operation , cx : & Context ) -> bool {
397
407
let packet = Box :: into_raw ( Packet :: < T > :: empty_on_heap ( ) ) ;
398
408
399
- let mut inner = self . 0 . inner . lock ( ) ;
409
+ let mut inner = self . 0 . inner . lock ( ) . unwrap ( ) ;
400
410
inner
401
411
. receivers
402
412
. register_with_packet ( oper, packet as * mut ( ) , cx) ;
@@ -405,7 +415,7 @@ impl<T> SelectHandle for Receiver<'_, T> {
405
415
}
406
416
407
417
fn unregister ( & self , oper : Operation ) {
408
- if let Some ( operation) = self . 0 . inner . lock ( ) . receivers . unregister ( oper) {
418
+ if let Some ( operation) = self . 0 . inner . lock ( ) . unwrap ( ) . receivers . unregister ( oper) {
409
419
unsafe {
410
420
drop ( Box :: from_raw ( operation. packet as * mut Packet < T > ) ) ;
411
421
}
@@ -418,18 +428,18 @@ impl<T> SelectHandle for Receiver<'_, T> {
418
428
}
419
429
420
430
fn is_ready ( & self ) -> bool {
421
- let inner = self . 0 . inner . lock ( ) ;
431
+ let inner = self . 0 . inner . lock ( ) . unwrap ( ) ;
422
432
inner. senders . can_select ( ) || inner. is_disconnected
423
433
}
424
434
425
435
fn watch ( & self , oper : Operation , cx : & Context ) -> bool {
426
- let mut inner = self . 0 . inner . lock ( ) ;
436
+ let mut inner = self . 0 . inner . lock ( ) . unwrap ( ) ;
427
437
inner. receivers . watch ( oper, cx) ;
428
438
inner. senders . can_select ( ) || inner. is_disconnected
429
439
}
430
440
431
441
fn unwatch ( & self , oper : Operation ) {
432
- let mut inner = self . 0 . inner . lock ( ) ;
442
+ let mut inner = self . 0 . inner . lock ( ) . unwrap ( ) ;
433
443
inner. receivers . unwatch ( oper) ;
434
444
}
435
445
}
@@ -446,7 +456,7 @@ impl<T> SelectHandle for Sender<'_, T> {
446
456
fn register ( & self , oper : Operation , cx : & Context ) -> bool {
447
457
let packet = Box :: into_raw ( Packet :: < T > :: empty_on_heap ( ) ) ;
448
458
449
- let mut inner = self . 0 . inner . lock ( ) ;
459
+ let mut inner = self . 0 . inner . lock ( ) . unwrap ( ) ;
450
460
inner
451
461
. senders
452
462
. register_with_packet ( oper, packet as * mut ( ) , cx) ;
@@ -455,7 +465,7 @@ impl<T> SelectHandle for Sender<'_, T> {
455
465
}
456
466
457
467
fn unregister ( & self , oper : Operation ) {
458
- if let Some ( operation) = self . 0 . inner . lock ( ) . senders . unregister ( oper) {
468
+ if let Some ( operation) = self . 0 . inner . lock ( ) . unwrap ( ) . senders . unregister ( oper) {
459
469
unsafe {
460
470
drop ( Box :: from_raw ( operation. packet as * mut Packet < T > ) ) ;
461
471
}
@@ -468,18 +478,18 @@ impl<T> SelectHandle for Sender<'_, T> {
468
478
}
469
479
470
480
fn is_ready ( & self ) -> bool {
471
- let inner = self . 0 . inner . lock ( ) ;
481
+ let inner = self . 0 . inner . lock ( ) . unwrap ( ) ;
472
482
inner. receivers . can_select ( ) || inner. is_disconnected
473
483
}
474
484
475
485
fn watch ( & self , oper : Operation , cx : & Context ) -> bool {
476
- let mut inner = self . 0 . inner . lock ( ) ;
486
+ let mut inner = self . 0 . inner . lock ( ) . unwrap ( ) ;
477
487
inner. senders . watch ( oper, cx) ;
478
488
inner. receivers . can_select ( ) || inner. is_disconnected
479
489
}
480
490
481
491
fn unwatch ( & self , oper : Operation ) {
482
- let mut inner = self . 0 . inner . lock ( ) ;
492
+ let mut inner = self . 0 . inner . lock ( ) . unwrap ( ) ;
483
493
inner. senders . unwatch ( oper) ;
484
494
}
485
495
}
0 commit comments