|
|
|
@ -338,10 +338,15 @@ func (c *Connection) waitForDataOutput() error {
|
|
|
|
|
|
|
|
|
|
// Write implements io.Writer.
|
|
|
|
|
func (c *Connection) Write(b []byte) (int, error) { |
|
|
|
|
totalWritten := 0 |
|
|
|
|
updatePending := false |
|
|
|
|
defer func() { |
|
|
|
|
if updatePending { |
|
|
|
|
c.dataUpdater.WakeUp() |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
for { |
|
|
|
|
dataWritten := false |
|
|
|
|
totalWritten := 0 |
|
|
|
|
for { |
|
|
|
|
if c == nil || c.State() != StateActive { |
|
|
|
|
return totalWritten, io.ErrClosedPipe |
|
|
|
@ -354,15 +359,16 @@ func (c *Connection) Write(b []byte) (int, error) {
|
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dataWritten = true |
|
|
|
|
updatePending = true |
|
|
|
|
|
|
|
|
|
if totalWritten == len(b) { |
|
|
|
|
return totalWritten, nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if dataWritten { |
|
|
|
|
if updatePending { |
|
|
|
|
c.dataUpdater.WakeUp() |
|
|
|
|
updatePending = false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := c.waitForDataOutput(); err != nil { |
|
|
|
@ -375,8 +381,14 @@ func (c *Connection) Write(b []byte) (int, error) {
|
|
|
|
|
func (c *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error { |
|
|
|
|
defer mb.Release() |
|
|
|
|
|
|
|
|
|
updatePending := false |
|
|
|
|
defer func() { |
|
|
|
|
if updatePending { |
|
|
|
|
c.dataUpdater.WakeUp() |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
for { |
|
|
|
|
dataWritten := false |
|
|
|
|
for { |
|
|
|
|
if c == nil || c.State() != StateActive { |
|
|
|
|
return io.ErrClosedPipe |
|
|
|
@ -387,14 +399,15 @@ func (c *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
|
|
|
|
}) { |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
dataWritten = true |
|
|
|
|
updatePending = true |
|
|
|
|
if mb.IsEmpty() { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if dataWritten { |
|
|
|
|
if updatePending { |
|
|
|
|
c.dataUpdater.WakeUp() |
|
|
|
|
updatePending = false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := c.waitForDataOutput(); err != nil { |
|
|
|
|