|
@@ -377,10 +377,31 @@ func (s *Session) keepalive() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func (s *Session) bodyClone(buf []byte, p *sendReady) {
|
|
|
+ if buf == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ p.mu.Lock()
|
|
|
+ defer p.mu.Unlock()
|
|
|
+
|
|
|
+ if p.Body == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ newBody := make([]byte, len(buf))
|
|
|
+ copy(newBody, buf)
|
|
|
+ p.Body = newBody
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
-func (s *Session) waitForSend(hdr header, body []byte) error {
|
|
|
+func (s *Session) waitForSend(hdr header, body []byte) (err error) {
|
|
|
errCh := make(chan error, 1)
|
|
|
- return s.waitForSendErr(hdr, body, errCh)
|
|
|
+ err = s.waitForSendErr(hdr, body, errCh)
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
|
|
@@ -398,7 +419,6 @@ func (s *Session) waitForSendErr(hdr header, body []byte, errCh chan error) erro
|
|
|
}
|
|
|
timerPool.Put(t)
|
|
|
}()
|
|
|
-
|
|
|
ready := &sendReady{Hdr: hdr, Body: body, Err: errCh}
|
|
|
select {
|
|
|
case s.sendCh <- ready:
|
|
@@ -407,35 +427,14 @@ func (s *Session) waitForSendErr(hdr header, body []byte, errCh chan error) erro
|
|
|
case <-timer.C:
|
|
|
return ErrConnectionWriteTimeout
|
|
|
}
|
|
|
-
|
|
|
- bodyCopy := func() {
|
|
|
- if body == nil {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- ready.mu.Lock()
|
|
|
- defer ready.mu.Unlock()
|
|
|
-
|
|
|
- if ready.Body == nil {
|
|
|
- return
|
|
|
- }
|
|
|
- newBody := make([]byte, len(body))
|
|
|
- copy(newBody, body)
|
|
|
- ready.Body = newBody
|
|
|
- }
|
|
|
-
|
|
|
select {
|
|
|
case err := <-errCh:
|
|
|
return err
|
|
|
case <-s.shutdownCh:
|
|
|
- bodyCopy()
|
|
|
+ s.bodyClone(body, ready)
|
|
|
return ErrSessionShutdown
|
|
|
case <-timer.C:
|
|
|
- bodyCopy()
|
|
|
+ s.bodyClone(body, ready)
|
|
|
return ErrConnectionWriteTimeout
|
|
|
}
|
|
|
}
|