@@ -310,10 +310,14 @@ func WithMaxConnBufferSize(maxBufferSize int) connOption {
310310}
311311
312312func (c * Conn ) Close () {
313+ rc , err := c .queueRequest (opClose , & closeRequest {}, & closeResponse {}, nil )
314+ if err != nil {
315+ return
316+ }
313317 close (c .shouldQuit )
314318
315319 select {
316- case <- c . queueRequest ( opClose , & closeRequest {}, & closeResponse {}, nil ) :
320+ case <- rc :
317321 case <- time .After (time .Second ):
318322 }
319323}
@@ -933,7 +937,13 @@ func (c *Conn) addWatcher(path string, watchType watchType) <-chan Event {
933937 return ch
934938}
935939
936- func (c * Conn ) queueRequest (opcode int32 , req interface {}, res interface {}, recvFunc func (* request , * responseHeader , error )) <- chan response {
940+ func (c * Conn ) queueRequest (opcode int32 , req interface {}, res interface {}, recvFunc func (* request , * responseHeader , error )) (<- chan response , error ) {
941+ select {
942+ case <- c .shouldQuit :
943+ return nil , ErrClosing
944+ default :
945+ }
946+
937947 rq := & request {
938948 xid : c .nextXid (),
939949 opcode : opcode ,
@@ -942,13 +952,27 @@ func (c *Conn) queueRequest(opcode int32, req interface{}, res interface{}, recv
942952 recvChan : make (chan response , 1 ),
943953 recvFunc : recvFunc ,
944954 }
945- c .sendChan <- rq
946- return rq .recvChan
955+
956+ select {
957+ case c .sendChan <- rq :
958+ return rq .recvChan , nil
959+ case <- c .shouldQuit :
960+ return nil , ErrClosing
961+ }
947962}
948963
949964func (c * Conn ) request (opcode int32 , req interface {}, res interface {}, recvFunc func (* request , * responseHeader , error )) (int64 , error ) {
950- r := <- c .queueRequest (opcode , req , res , recvFunc )
951- return r .zxid , r .err
965+ rc , err := c .queueRequest (opcode , req , res , recvFunc )
966+ if err != nil {
967+ return 0 , err
968+ }
969+
970+ select {
971+ case r := <- rc :
972+ return r .zxid , r .err
973+ case <- c .shouldQuit :
974+ return 0 , ErrClosing
975+ }
952976}
953977
954978func (c * Conn ) AddAuth (scheme string , auth []byte ) error {
0 commit comments