@@ -282,7 +282,7 @@ struct Active<T> {
282
282
socket : Fuse < frame:: Io < T > > ,
283
283
next_id : u32 ,
284
284
285
- streams : IntMap < StreamId , Arc < Mutex < stream:: Shared > > > ,
285
+ streams : IntMap < StreamId , stream:: Shared > ,
286
286
stream_receivers : SelectAll < TaggedStream < StreamId , mpsc:: Receiver < StreamCommand > > > ,
287
287
no_streams_waker : Option < Waker > ,
288
288
@@ -507,9 +507,8 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
507
507
let s = self . streams . remove ( & stream_id) . expect ( "stream not found" ) ;
508
508
509
509
log:: trace!( "{}: removing dropped stream {}" , self . id, stream_id) ;
510
- let frame = {
511
- let mut shared = s. lock ( ) ;
512
- let frame = match shared. update_state ( self . id , stream_id, State :: Closed ) {
510
+ let frame = s. with_mut ( |inner| {
511
+ let frame = match inner. update_state ( self . id , stream_id, State :: Closed ) {
513
512
// The stream was dropped without calling `poll_close`.
514
513
// We reset the stream to inform the remote of the closure.
515
514
State :: Open { .. } => {
@@ -541,14 +540,15 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
541
540
// remote end has already done so in the past.
542
541
State :: Closed => None ,
543
542
} ;
544
- if let Some ( w) = shared . reader . take ( ) {
543
+ if let Some ( w) = inner . reader . take ( ) {
545
544
w. wake ( )
546
545
}
547
- if let Some ( w) = shared . writer . take ( ) {
546
+ if let Some ( w) = inner . writer . take ( ) {
548
547
w. wake ( )
549
548
}
549
+
550
550
frame
551
- } ;
551
+ } ) ;
552
552
frame. map ( Into :: into)
553
553
}
554
554
@@ -565,10 +565,8 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
565
565
&& matches ! ( frame. header( ) . tag( ) , Tag :: Data | Tag :: WindowUpdate )
566
566
{
567
567
let id = frame. header ( ) . stream_id ( ) ;
568
- if let Some ( stream) = self . streams . get ( & id) {
569
- stream
570
- . lock ( )
571
- . update_state ( self . id , id, State :: Open { acknowledged : true } ) ;
568
+ if let Some ( shared) = self . streams . get ( & id) {
569
+ shared. update_state ( self . id , id, State :: Open { acknowledged : true } ) ;
572
570
}
573
571
if let Some ( waker) = self . new_outbound_stream_waker . take ( ) {
574
572
waker. wake ( ) ;
@@ -590,14 +588,15 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
590
588
if frame. header ( ) . flags ( ) . contains ( header:: RST ) {
591
589
// stream reset
592
590
if let Some ( s) = self . streams . get_mut ( & stream_id) {
593
- let mut shared = s. lock ( ) ;
594
- shared. update_state ( self . id , stream_id, State :: Closed ) ;
595
- if let Some ( w) = shared. reader . take ( ) {
596
- w. wake ( )
597
- }
598
- if let Some ( w) = shared. writer . take ( ) {
599
- w. wake ( )
600
- }
591
+ s. with_mut ( |inner| {
592
+ inner. update_state ( self . id , stream_id, State :: Closed ) ;
593
+ if let Some ( w) = inner. reader . take ( ) {
594
+ w. wake ( )
595
+ }
596
+ if let Some ( w) = inner. writer . take ( ) {
597
+ w. wake ( )
598
+ }
599
+ } ) ;
601
600
}
602
601
return Action :: None ;
603
602
}
@@ -628,35 +627,40 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
628
627
}
629
628
let stream = self . make_new_inbound_stream ( stream_id, DEFAULT_CREDIT ) ;
630
629
{
631
- let mut shared = stream. shared ( ) ;
632
- if is_finish {
633
- shared. update_state ( self . id , stream_id, State :: RecvClosed ) ;
634
- }
635
- shared. consume_receive_window ( frame. body_len ( ) ) ;
636
- shared. buffer . push ( frame. into_body ( ) ) ;
630
+ stream. shared ( ) . with_mut ( |inner| {
631
+ if is_finish {
632
+ inner. update_state ( self . id , stream_id, State :: RecvClosed ) ;
633
+ }
634
+ inner. consume_receive_window ( frame. body_len ( ) ) ;
635
+ inner. buffer . push ( frame. into_body ( ) ) ;
636
+ } )
637
637
}
638
638
self . streams . insert ( stream_id, stream. clone_shared ( ) ) ;
639
639
return Action :: New ( stream) ;
640
640
}
641
641
642
- if let Some ( s) = self . streams . get_mut ( & stream_id) {
643
- let mut shared = s. lock ( ) ;
644
- if frame. body_len ( ) > shared. receive_window ( ) {
645
- log:: error!(
646
- "{}/{}: frame body larger than window of stream" ,
647
- self . id,
648
- stream_id
649
- ) ;
650
- return Action :: Terminate ( Frame :: protocol_error ( ) ) ;
651
- }
652
- if is_finish {
653
- shared. update_state ( self . id , stream_id, State :: RecvClosed ) ;
654
- }
655
- shared. consume_receive_window ( frame. body_len ( ) ) ;
656
- shared. buffer . push ( frame. into_body ( ) ) ;
657
- if let Some ( w) = shared. reader . take ( ) {
658
- w. wake ( )
659
- }
642
+ if let Some ( shared) = self . streams . get_mut ( & stream_id) {
643
+ let action = shared. with_mut ( |inner| {
644
+ if frame. body_len ( ) > inner. receive_window ( ) {
645
+ log:: error!(
646
+ "{}/{}: frame body larger than window of stream" ,
647
+ self . id,
648
+ stream_id
649
+ ) ;
650
+ Action :: Terminate ( Frame :: protocol_error ( ) )
651
+ } else {
652
+ if is_finish {
653
+ inner. update_state ( self . id , stream_id, State :: RecvClosed ) ;
654
+ }
655
+ inner. consume_receive_window ( frame. body_len ( ) ) ;
656
+ inner. buffer . push ( frame. into_body ( ) ) ;
657
+ if let Some ( w) = inner. reader . take ( ) {
658
+ w. wake ( )
659
+ }
660
+ Action :: None
661
+ }
662
+ } ) ;
663
+ return action;
660
664
} else {
661
665
log:: trace!(
662
666
"{}/{}: data frame for unknown stream, possibly dropped earlier: {:?}" ,
@@ -681,15 +685,16 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
681
685
682
686
if frame. header ( ) . flags ( ) . contains ( header:: RST ) {
683
687
// stream reset
684
- if let Some ( s) = self . streams . get_mut ( & stream_id) {
685
- let mut shared = s. lock ( ) ;
686
- shared. update_state ( self . id , stream_id, State :: Closed ) ;
687
- if let Some ( w) = shared. reader . take ( ) {
688
- w. wake ( )
689
- }
690
- if let Some ( w) = shared. writer . take ( ) {
691
- w. wake ( )
692
- }
688
+ if let Some ( shared) = self . streams . get_mut ( & stream_id) {
689
+ shared. with_mut ( |inner| {
690
+ inner. update_state ( self . id , stream_id, State :: Closed ) ;
691
+ if let Some ( w) = inner. reader . take ( ) {
692
+ w. wake ( )
693
+ }
694
+ if let Some ( w) = inner. writer . take ( ) {
695
+ w. wake ( )
696
+ }
697
+ } ) ;
693
698
}
694
699
return Action :: None ;
695
700
}
@@ -723,19 +728,21 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
723
728
return Action :: New ( stream) ;
724
729
}
725
730
726
- if let Some ( s) = self . streams . get_mut ( & stream_id) {
727
- let mut shared = s. lock ( ) ;
728
- shared. increase_send_window_by ( frame. header ( ) . credit ( ) ) ;
729
- if is_finish {
730
- shared. update_state ( self . id , stream_id, State :: RecvClosed ) ;
731
+ if let Some ( shared) = self . streams . get_mut ( & stream_id) {
732
+ shared. with_mut ( |inner| {
733
+ inner. increase_send_window_by ( frame. header ( ) . credit ( ) ) ;
734
+ if is_finish {
735
+ inner. update_state ( self . id , stream_id, State :: RecvClosed ) ;
736
+
737
+ if let Some ( w) = inner. reader . take ( ) {
738
+ w. wake ( )
739
+ }
740
+ }
731
741
732
- if let Some ( w) = shared . reader . take ( ) {
742
+ if let Some ( w) = inner . writer . take ( ) {
733
743
w. wake ( )
734
744
}
735
- }
736
- if let Some ( w) = shared. writer . take ( ) {
737
- w. wake ( )
738
- }
745
+ } ) ;
739
746
} else {
740
747
log:: trace!(
741
748
"{}/{}: window update for unknown stream, possibly dropped earlier: {:?}" ,
@@ -848,7 +855,7 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
848
855
Mode :: Client => id. is_client ( ) ,
849
856
Mode :: Server => id. is_server ( ) ,
850
857
} )
851
- . filter ( |( _, s) | s. lock ( ) . is_pending_ack ( ) )
858
+ . filter ( |( _, s) | s. is_pending_ack ( ) )
852
859
. count ( )
853
860
}
854
861
@@ -867,15 +874,16 @@ impl<T: AsyncRead + AsyncWrite + Unpin> Active<T> {
867
874
impl < T > Active < T > {
868
875
/// Close and drop all `Stream`s and wake any pending `Waker`s.
869
876
fn drop_all_streams ( & mut self ) {
870
- for ( id, s) in self . streams . drain ( ) {
871
- let mut shared = s. lock ( ) ;
872
- shared. update_state ( self . id , id, State :: Closed ) ;
873
- if let Some ( w) = shared. reader . take ( ) {
874
- w. wake ( )
875
- }
876
- if let Some ( w) = shared. writer . take ( ) {
877
- w. wake ( )
878
- }
877
+ for ( id, shared) in self . streams . drain ( ) {
878
+ shared. with_mut ( |inner| {
879
+ inner. update_state ( self . id , id, State :: Closed ) ;
880
+ if let Some ( w) = inner. reader . take ( ) {
881
+ w. wake ( )
882
+ }
883
+ if let Some ( w) = inner. writer . take ( ) {
884
+ w. wake ( )
885
+ }
886
+ } ) ;
879
887
}
880
888
}
881
889
}
0 commit comments