@@ -36,28 +36,30 @@ func isSwitchReadFuncError(err error) bool {
3636}
3737
3838type serverConnReader struct {
39- sc * ServerConn
40- conn * conn.Conn
39+ sc * ServerConn
40+
41+ done chan struct {}
4142}
4243
4344func (cr * serverConnReader ) initialize () {
45+ cr .done = make (chan struct {})
46+
4447 go cr .run ()
4548}
4649
4750func (cr * serverConnReader ) wait () {
48- for {
49- select {
50- case <- cr .sc .chReadError :
51- return
52-
53- case req := <- cr .sc .chRequest :
54- req .res <- fmt .Errorf ("terminated" )
55- }
56- }
51+ <- cr .done
5752}
5853
5954func (cr * serverConnReader ) run () {
60- cr .sc .chReadError <- cr .runInner ()
55+ defer close (cr .done )
56+
57+ err := cr .runInner ()
58+
59+ select {
60+ case cr .sc .chReadError <- err :
61+ case <- cr .sc .ctx .Done ():
62+ }
6163}
6264
6365func (cr * serverConnReader ) runInner () error {
@@ -71,7 +73,7 @@ func (cr *serverConnReader) runInner() error {
7173 }
7274 }
7375
74- cr .conn = conn .NewConn (bufio .NewReader (rw ), rw )
76+ cr .sc . conn = conn .NewConn (bufio .NewReader (rw ), rw )
7577
7678 readFunc := cr .readFuncStandard
7779
@@ -171,7 +173,7 @@ func (cr *serverConnReader) readFuncStandard() error {
171173 cr .sc .nconn .SetReadDeadline (time.Time {})
172174
173175 for {
174- what , err := cr .conn .Read ()
176+ what , err := cr .sc . conn .Read ()
175177 if err != nil {
176178 return err
177179 }
@@ -180,7 +182,12 @@ func (cr *serverConnReader) readFuncStandard() error {
180182 case * base.Request :
181183 cres := make (chan error )
182184 req := readReq {req : what , res : cres }
183- cr .sc .chRequest <- req
185+
186+ select {
187+ case cr .sc .chRequest <- req :
188+ case <- cr .sc .ctx .Done ():
189+ return fmt .Errorf ("terminated" )
190+ }
184191
185192 err = <- cres
186193 if err != nil {
@@ -207,7 +214,7 @@ func (cr *serverConnReader) readFuncTCP() error {
207214 cr .sc .nconn .SetReadDeadline (time .Now ().Add (cr .sc .s .ReadTimeout ))
208215 }
209216
210- what , err := cr .conn .Read ()
217+ what , err := cr .sc . conn .Read ()
211218 if err != nil {
212219 return err
213220 }
@@ -216,7 +223,12 @@ func (cr *serverConnReader) readFuncTCP() error {
216223 case * base.Request :
217224 cres := make (chan error )
218225 req := readReq {req : what , res : cres }
219- cr .sc .chRequest <- req
226+
227+ select {
228+ case cr .sc .chRequest <- req :
229+ case <- cr .sc .ctx .Done ():
230+ return fmt .Errorf ("terminated" )
231+ }
220232
221233 err = <- cres
222234 if err != nil {
0 commit comments