From b9e0b11e7da387bbb426d25c36d495c4f099722f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 19 Mar 2015 15:16:06 +0100 Subject: 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. --- p2p/message.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'p2p/message.go') diff --git a/p2p/message.go b/p2p/message.go index 5dc7d5460..ef3630a90 100644 --- a/p2p/message.go +++ b/p2p/message.go @@ -185,7 +185,10 @@ func (p *MsgPipeRW) WriteMsg(msg Msg) error { case p.w <- msg: if msg.Size > 0 { // wait for payload read or discard - <-consumed + select { + case <-consumed: + case <-p.closing: + } } return nil case <-p.closing: @@ -207,8 +210,8 @@ func (p *MsgPipeRW) ReadMsg() (Msg, error) { } // Close unblocks any pending ReadMsg and WriteMsg calls on both ends -// of the pipe. They will return ErrPipeClosed. Note that Close does -// not interrupt any reads from a message payload. +// of the pipe. They will return ErrPipeClosed. Close also +// interrupts any reads from a message payload. func (p *MsgPipeRW) Close() error { if atomic.AddInt32(p.closed, 1) != 1 { // someone else is already closing -- cgit v1.2.3