@@ -116,7 +116,9 @@ func connect(ctx context.Context, scheme, addr string, opts Options) (conn *Conn
116
116
// remove deadline
117
117
conn .tcpConn .SetDeadline (time.Time {})
118
118
119
- go conn .worker ()
119
+ go conn .writer ()
120
+
121
+ go conn .reader ()
120
122
121
123
return
122
124
}
@@ -490,64 +492,34 @@ func (conn *Connection) setError(err error) {
490
492
}
491
493
}
492
494
493
- func (conn * Connection ) worker () {
494
- var wg sync.WaitGroup
495
-
496
- wg .Add (2 )
497
-
498
- go func () {
499
- err := conn .writer ()
500
- conn .setError (err )
501
- conn .stop ()
502
- wg .Done ()
503
- }()
504
-
505
- go func () {
506
- err := conn .reader ()
507
- conn .setError (err )
508
- conn .stop ()
509
- wg .Done ()
510
- }()
511
-
512
- wg .Wait ()
495
+ func (conn * Connection ) writer () {
496
+ var err error
513
497
514
- // release all pending packets
515
498
writeChan := conn .writeChan
499
+ stopChan := conn .exit
500
+ w := bufio .NewWriterSize (conn .ccw , DefaultWriterBufSize )
516
501
517
- CLEANUP_LOOP:
518
- for {
519
- select {
520
- case req := <- writeChan :
521
- pp := req .packet
522
- if pp != nil {
523
- req .packet = nil
524
- conn .releasePacket (pp )
525
- }
526
- default :
527
- break CLEANUP_LOOP
528
- }
529
- }
502
+ defer close (conn .closed )
530
503
531
- // send error reply to all pending requests
532
- conn .requests .CleanUp (func (req * request ) {
533
- select {
534
- case req .replyChan <- & AsyncResult {
535
- Error : ConnectionClosedError (conn ),
536
- ErrorCode : ErrNoConnection ,
537
- Opaque : req .opaque ,
538
- }:
539
- default :
504
+ defer func () {
505
+ CLEANUP_LOOP:
506
+ for {
507
+ select {
508
+ case req := <- writeChan :
509
+ pp := req .packet
510
+ if pp != nil {
511
+ req .packet = nil
512
+ conn .releasePacket (pp )
513
+ }
514
+ default :
515
+ break CLEANUP_LOOP
516
+ }
540
517
}
541
- requestPool .Put (req )
542
- })
518
+ }()
543
519
544
- close (conn .closed )
545
- }
520
+ defer conn .setError (err )
546
521
547
- func (conn * Connection ) writer () (err error ) {
548
- writeChan := conn .writeChan
549
- stopChan := conn .exit
550
- w := bufio .NewWriterSize (conn .ccw , DefaultWriterBufSize )
522
+ defer conn .stop ()
551
523
552
524
wr := func (w io.Writer , req * request ) error {
553
525
packet := req .packet
@@ -596,13 +568,35 @@ WRITER_LOOP:
596
568
}
597
569
}
598
570
}
599
-
600
- return
601
571
}
602
572
603
- func (conn * Connection ) reader () ( err error ) {
573
+ func (conn * Connection ) reader () {
604
574
var pp * BinaryPacket
605
575
var requestID uint64
576
+ var err error
577
+
578
+ defer func () {
579
+ <- conn .closed
580
+ }()
581
+
582
+ defer func () {
583
+ // send error reply to all pending requests
584
+ conn .requests .CleanUp (func (req * request ) {
585
+ select {
586
+ case req .replyChan <- & AsyncResult {
587
+ Error : ConnectionClosedError (conn ),
588
+ ErrorCode : ErrNoConnection ,
589
+ Opaque : req .opaque ,
590
+ }:
591
+ default :
592
+ }
593
+ requestPool .Put (req )
594
+ })
595
+ }()
596
+
597
+ defer conn .setError (err )
598
+
599
+ defer conn .stop ()
606
600
607
601
r := bufio .NewReaderSize (conn .ccr , DefaultReaderBufSize )
608
602
@@ -643,5 +637,4 @@ READER_LOOP:
643
637
if pp != nil {
644
638
conn .releasePacket (pp )
645
639
}
646
- return
647
640
}
0 commit comments