@@ -62,7 +62,7 @@ impl Client {
62
62
63
63
fn new_client ( pipe_client : ClientConnection ) -> Result < Client > {
64
64
let client = Arc :: new ( pipe_client) ;
65
-
65
+ let weak_client = Arc :: downgrade ( & client ) ;
66
66
let ( sender_tx, rx) : ( Sender , Receiver ) = mpsc:: channel ( ) ;
67
67
let recver_map_orig = Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ;
68
68
@@ -98,20 +98,26 @@ impl Client {
98
98
trace ! ( "Sender quit" ) ;
99
99
} ) ;
100
100
101
- //Recver
101
+ //Reciver
102
102
let receiver_connection = connection;
103
- let receiver_client = client. clone ( ) ;
103
+ //Clone as weak Arc , it will not add the count of client
104
+ let receiver_client = weak_client. clone ( ) ;
104
105
thread:: spawn ( move || {
105
106
loop {
106
- match receiver_client. ready ( ) {
107
- Ok ( None ) => {
108
- continue ;
109
- }
110
- Ok ( _) => { }
111
- Err ( e) => {
112
- error ! ( "pipeConnection ready error {:?}" , e) ;
113
- break ;
107
+
108
+ if let Some ( receiver_client) = receiver_client. upgrade ( ) {
109
+ match receiver_client. ready ( ) {
110
+ Ok ( None ) => {
111
+ continue ;
112
+ }
113
+ Ok ( _) => { }
114
+ Err ( e) => {
115
+ error ! ( "pipeConnection ready error {:?}" , e) ;
116
+ break ;
117
+ }
114
118
}
119
+ } else {
120
+ break ;
115
121
}
116
122
117
123
match read_message ( & receiver_connection) {
@@ -140,10 +146,6 @@ impl Client {
140
146
} ;
141
147
}
142
148
143
- let _ = receiver_client
144
- . close_receiver ( )
145
- . map_err ( |e| warn ! ( "failed to close with error: {:?}" , e) ) ;
146
-
147
149
trace ! ( "Receiver quit" ) ;
148
150
} ) ;
149
151
@@ -191,7 +193,9 @@ impl Client {
191
193
192
194
impl Drop for ClientConnection {
193
195
fn drop ( & mut self ) {
196
+ //close all fd , make sure all fd have been release
194
197
self . close ( ) . unwrap ( ) ;
198
+ self . close_receiver ( ) . unwrap ( ) ;
195
199
trace ! ( "Client is dropped" ) ;
196
200
}
197
201
}
0 commit comments