p2p: interrupt MsgPipe payload read/write

This is better because protocols might not actually read the payload for
some errors (msg too big, etc.) which can be a pain to test with the old
behaviour.
This commit is contained in:
Felix Lange 2015-03-19 15:16:06 +01:00
parent a7bced779a
commit b9e0b11e7d

@ -185,7 +185,10 @@ func (p *MsgPipeRW) WriteMsg(msg Msg) error {
case p.w <- msg: case p.w <- msg:
if msg.Size > 0 { if msg.Size > 0 {
// wait for payload read or discard // wait for payload read or discard
<-consumed select {
case <-consumed:
case <-p.closing:
}
} }
return nil return nil
case <-p.closing: case <-p.closing:
@ -207,8 +210,8 @@ func (p *MsgPipeRW) ReadMsg() (Msg, error) {
} }
// Close unblocks any pending ReadMsg and WriteMsg calls on both ends // Close unblocks any pending ReadMsg and WriteMsg calls on both ends
// of the pipe. They will return ErrPipeClosed. Note that Close does // of the pipe. They will return ErrPipeClosed. Close also
// not interrupt any reads from a message payload. // interrupts any reads from a message payload.
func (p *MsgPipeRW) Close() error { func (p *MsgPipeRW) Close() error {
if atomic.AddInt32(p.closed, 1) != 1 { if atomic.AddInt32(p.closed, 1) != 1 {
// someone else is already closing // someone else is already closing