@@ -47,6 +47,7 @@ use std::{
47
47
fmt,
48
48
} ;
49
49
50
+ #[ cfg( feature = "spin" ) ]
50
51
use spin1:: { Mutex as Spinlock , MutexGuard as SpinlockGuard } ;
51
52
use crate :: signal:: { Signal , SyncSignal } ;
52
53
@@ -256,55 +257,86 @@ enum TryRecvTimeoutError {
256
257
}
257
258
258
259
// TODO: Investigate some sort of invalidation flag for timeouts
260
+ #[ cfg( feature = "spin" ) ]
259
261
struct Hook < T , S : ?Sized > ( Option < Spinlock < Option < T > > > , S ) ;
260
262
263
+ #[ cfg( not( feature = "spin" ) ) ]
264
+ struct Hook < T , S : ?Sized > ( Option < Mutex < Option < T > > > , S ) ;
265
+
266
+ #[ cfg( feature = "spin" ) ]
261
267
impl < T , S : ?Sized + Signal > Hook < T , S > {
262
- pub fn slot ( msg : Option < T > , signal : S ) -> Arc < Self > where S : Sized {
268
+ pub fn slot ( msg : Option < T > , signal : S ) -> Arc < Self >
269
+ where
270
+ S : Sized ,
271
+ {
263
272
Arc :: new ( Self ( Some ( Spinlock :: new ( msg) ) , signal) )
264
273
}
265
274
266
- pub fn trigger ( signal : S ) -> Arc < Self > where S : Sized {
267
- Arc :: new ( Self ( None , signal ) )
275
+ fn lock ( & self ) -> Option < SpinlockGuard < ' _ , Option < T > > > {
276
+ self . 0 . as_ref ( ) . map ( |s| s . lock ( ) )
268
277
}
278
+ }
269
279
270
- pub fn signal ( & self ) -> & S {
271
- & self . 1
280
+ #[ cfg( not( feature = "spin" ) ) ]
281
+ impl < T , S : ?Sized + Signal > Hook < T , S > {
282
+ pub fn slot ( msg : Option < T > , signal : S ) -> Arc < Self >
283
+ where
284
+ S : Sized ,
285
+ {
286
+ Arc :: new ( Self ( Some ( Mutex :: new ( msg) ) , signal) )
272
287
}
273
288
274
- pub fn fire_nothing ( & self ) -> bool {
275
- self . signal ( ) . fire ( )
289
+ fn lock ( & self ) -> Option < MutexGuard < ' _ , Option < T > > > {
290
+ self . 0 . as_ref ( ) . map ( |s| s . lock ( ) . unwrap ( ) )
276
291
}
292
+ }
277
293
294
+ impl < T , S : ?Sized + Signal > Hook < T , S > {
278
295
pub fn fire_recv ( & self ) -> ( T , & S ) {
279
- let msg = self . 0 . as_ref ( ) . unwrap ( ) . lock ( ) . take ( ) . unwrap ( ) ;
296
+ let msg = self . lock ( ) . unwrap ( ) . take ( ) . unwrap ( ) ;
280
297
( msg, self . signal ( ) )
281
298
}
282
299
283
300
pub fn fire_send ( & self , msg : T ) -> ( Option < T > , & S ) {
284
- let ret = match & self . 0 {
285
- Some ( hook ) => {
286
- * hook . lock ( ) = Some ( msg) ;
301
+ let ret = match self . lock ( ) {
302
+ Some ( mut lock ) => {
303
+ * lock = Some ( msg) ;
287
304
None
288
- } ,
305
+ }
289
306
None => Some ( msg) ,
290
307
} ;
291
308
( ret, self . signal ( ) )
292
309
}
293
310
294
311
pub fn is_empty ( & self ) -> bool {
295
- self . 0 . as_ref ( ) . map ( |s| s. lock ( ) . is_none ( ) ) . unwrap_or ( true )
312
+ self . lock ( ) . map ( |s| s. is_none ( ) ) . unwrap_or ( true )
296
313
}
297
314
298
315
pub fn try_take ( & self ) -> Option < T > {
299
- self . 0 . as_ref ( ) . and_then ( |s| s. lock ( ) . take ( ) )
316
+ self . lock ( ) . unwrap ( ) . take ( )
317
+ }
318
+
319
+ pub fn trigger ( signal : S ) -> Arc < Self >
320
+ where
321
+ S : Sized ,
322
+ {
323
+ Arc :: new ( Self ( None , signal) )
324
+ }
325
+
326
+ pub fn signal ( & self ) -> & S {
327
+ & self . 1
328
+ }
329
+
330
+ pub fn fire_nothing ( & self ) -> bool {
331
+ self . signal ( ) . fire ( )
300
332
}
301
333
}
302
334
303
335
impl < T > Hook < T , SyncSignal > {
304
336
pub fn wait_recv ( & self , abort : & AtomicBool ) -> Option < T > {
305
337
loop {
306
338
let disconnected = abort. load ( Ordering :: SeqCst ) ; // Check disconnect *before* msg
307
- let msg = self . 0 . as_ref ( ) . unwrap ( ) . lock ( ) . take ( ) ;
339
+ let msg = self . lock ( ) . unwrap ( ) . take ( ) ;
308
340
if let Some ( msg) = msg {
309
341
break Some ( msg) ;
310
342
} else if disconnected {
@@ -319,7 +351,7 @@ impl<T> Hook<T, SyncSignal> {
319
351
pub fn wait_deadline_recv ( & self , abort : & AtomicBool , deadline : Instant ) -> Result < T , bool > {
320
352
loop {
321
353
let disconnected = abort. load ( Ordering :: SeqCst ) ; // Check disconnect *before* msg
322
- let msg = self . 0 . as_ref ( ) . unwrap ( ) . lock ( ) . take ( ) ;
354
+ let msg = self . lock ( ) . unwrap ( ) . take ( ) ;
323
355
if let Some ( msg) = msg {
324
356
break Ok ( msg) ;
325
357
} else if disconnected {
@@ -335,7 +367,7 @@ impl<T> Hook<T, SyncSignal> {
335
367
pub fn wait_send ( & self , abort : & AtomicBool ) {
336
368
loop {
337
369
let disconnected = abort. load ( Ordering :: SeqCst ) ; // Check disconnect *before* msg
338
- if disconnected || self . 0 . as_ref ( ) . unwrap ( ) . lock ( ) . is_none ( ) {
370
+ if disconnected || self . lock ( ) . unwrap ( ) . is_none ( ) {
339
371
break ;
340
372
}
341
373
@@ -347,7 +379,7 @@ impl<T> Hook<T, SyncSignal> {
347
379
pub fn wait_deadline_send ( & self , abort : & AtomicBool , deadline : Instant ) -> Result < ( ) , bool > {
348
380
loop {
349
381
let disconnected = abort. load ( Ordering :: SeqCst ) ; // Check disconnect *before* msg
350
- if self . 0 . as_ref ( ) . unwrap ( ) . lock ( ) . is_none ( ) {
382
+ if self . lock ( ) . unwrap ( ) . is_none ( ) {
351
383
break Ok ( ( ) ) ;
352
384
} else if disconnected {
353
385
break Err ( false ) ;
0 commit comments