@@ -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,28 @@ 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
+ //this thread should use weak arc for ClientConnection, otherwise the thread will occupy a reference count of ClientConnection's arc,
104
+ //ClientConnection's drop will be not call until the thread finished. It means if all the external references are finished,
105
+ //this thread should be release.
106
+ let receiver_client = weak_client. clone ( ) ;
104
107
thread:: spawn ( move || {
105
108
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 ;
109
+ //The count of ClientConnection's Arc will be add one , and back to original value when this code ends.
110
+ if let Some ( receiver_client) = receiver_client. upgrade ( ) {
111
+ match receiver_client. ready ( ) {
112
+ Ok ( None ) => {
113
+ continue ;
114
+ }
115
+ Ok ( _) => { }
116
+ Err ( e) => {
117
+ error ! ( "pipeConnection ready error {:?}" , e) ;
118
+ break ;
119
+ }
114
120
}
121
+ } else {
122
+ break ;
115
123
}
116
124
117
125
match read_message ( & receiver_connection) {
@@ -140,10 +148,6 @@ impl Client {
140
148
} ;
141
149
}
142
150
143
- let _ = receiver_client
144
- . close_receiver ( )
145
- . map_err ( |e| warn ! ( "failed to close with error: {:?}" , e) ) ;
146
-
147
151
trace ! ( "Receiver quit" ) ;
148
152
} ) ;
149
153
@@ -191,7 +195,9 @@ impl Client {
191
195
192
196
impl Drop for ClientConnection {
193
197
fn drop ( & mut self ) {
198
+ //close all fd , make sure all fd have been release
194
199
self . close ( ) . unwrap ( ) ;
200
+ self . close_receiver ( ) . unwrap ( ) ;
195
201
trace ! ( "Client is dropped" ) ;
196
202
}
197
203
}
0 commit comments