@@ -18,7 +18,8 @@ use kinds::Send;
18
18
use rt;
19
19
use rt:: sched:: Scheduler ;
20
20
use rt:: local:: Local ;
21
- use rt:: select:: { Select , SelectPort } ;
21
+ use rt:: select:: { SelectInner , SelectPortInner } ;
22
+ use select:: { Select , SelectPort } ;
22
23
use unstable:: atomics:: { AtomicUint , AtomicOption , Acquire , Relaxed , SeqCst } ;
23
24
use unstable:: sync:: UnsafeAtomicRcBox ;
24
25
use util:: Void ;
@@ -113,7 +114,9 @@ impl<T> ChanOne<T> {
113
114
// 'do_resched' configures whether the scheduler immediately switches to
114
115
// the receiving task, or leaves the sending task still running.
115
116
fn try_send_inner ( self , val : T , do_resched : bool ) -> bool {
116
- rtassert ! ( !rt:: in_sched_context( ) ) ;
117
+ if do_resched {
118
+ rtassert ! ( !rt:: in_sched_context( ) ) ;
119
+ }
117
120
118
121
let mut this = self ;
119
122
let mut recvr_active = true ;
@@ -215,7 +218,7 @@ impl<T> PortOne<T> {
215
218
}
216
219
}
217
220
218
- impl < T > Select for PortOne < T > {
221
+ impl < T > SelectInner for PortOne < T > {
219
222
#[ inline] #[ cfg( not( test) ) ]
220
223
fn optimistic_check ( & mut self ) -> bool {
221
224
unsafe { ( * self . packet ( ) ) . state . load ( Acquire ) == STATE_ONE }
@@ -318,7 +321,9 @@ impl<T> Select for PortOne<T> {
318
321
}
319
322
}
320
323
321
- impl < T > SelectPort < T > for PortOne < T > {
324
+ impl < T > Select for PortOne < T > { }
325
+
326
+ impl < T > SelectPortInner < T > for PortOne < T > {
322
327
fn recv_ready ( self ) -> Option < T > {
323
328
let mut this = self ;
324
329
let packet = this. packet ( ) ;
@@ -349,6 +354,8 @@ impl<T> SelectPort<T> for PortOne<T> {
349
354
}
350
355
}
351
356
357
+ impl < T > SelectPort < T > for PortOne < T > { }
358
+
352
359
impl < T > Peekable < T > for PortOne < T > {
353
360
fn peek ( & self ) -> bool {
354
361
unsafe {
@@ -513,7 +520,7 @@ impl<T> Peekable<T> for Port<T> {
513
520
// of them, but a &Port<T> should also be selectable so you can select2 on it
514
521
// alongside a PortOne<U> without passing the port by value in recv_ready.
515
522
516
- impl < ' self , T > Select for & ' self Port < T > {
523
+ impl < ' self , T > SelectInner for & ' self Port < T > {
517
524
#[ inline]
518
525
fn optimistic_check ( & mut self ) -> bool {
519
526
do self . next . with_mut_ref |pone| { pone. optimistic_check ( ) }
@@ -531,7 +538,9 @@ impl<'self, T> Select for &'self Port<T> {
531
538
}
532
539
}
533
540
534
- impl < T > Select for Port < T > {
541
+ impl < ' self , T > Select for & ' self Port < T > { }
542
+
543
+ impl < T > SelectInner for Port < T > {
535
544
#[ inline]
536
545
fn optimistic_check ( & mut self ) -> bool {
537
546
( & * self ) . optimistic_check ( )
@@ -548,7 +557,9 @@ impl<T> Select for Port<T> {
548
557
}
549
558
}
550
559
551
- impl < ' self , T > SelectPort < T > for & ' self Port < T > {
560
+ impl < T > Select for Port < T > { }
561
+
562
+ impl < ' self , T > SelectPortInner < T > for & ' self Port < T > {
552
563
fn recv_ready ( self ) -> Option < T > {
553
564
match self . next . take ( ) . recv_ready ( ) {
554
565
Some ( StreamPayload { val, next } ) => {
@@ -560,6 +571,8 @@ impl<'self, T> SelectPort<T> for &'self Port<T> {
560
571
}
561
572
}
562
573
574
+ impl < ' self , T > SelectPort < T > for & ' self Port < T > { }
575
+
563
576
pub struct SharedChan < T > {
564
577
// Just like Chan, but a shared AtomicOption instead of Cell
565
578
priv next : UnsafeAtomicRcBox < AtomicOption < StreamChanOne < T > > >
0 commit comments