aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/peer.go
diff options
context:
space:
mode:
authorTaylor Gerring <taylor.gerring@gmail.com>2014-12-22 02:06:24 +0800
committerTaylor Gerring <taylor.gerring@gmail.com>2014-12-22 02:06:24 +0800
commitbab78bbeb691d95bdd0222435af0c11cb3485a79 (patch)
tree804c9689546ce362a2862b00bb4e76160052f5d6 /p2p/peer.go
parent7a79428278412ab1f73708af51bce063b000b7a7 (diff)
parent1360f027d9e365242466ca346b2b56f421729d91 (diff)
downloaddexon-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar
dexon-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.gz
dexon-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.bz2
dexon-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.lz
dexon-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.xz
dexon-bab78bbeb691d95bdd0222435af0c11cb3485a79.tar.zst
dexon-bab78bbeb691d95bdd0222435af0c11cb3485a79.zip
Merge branch 'tests' of github.com:ethereum/go-ethereum into tests
Diffstat (limited to 'p2p/peer.go')
-rw-r--r--p2p/peer.go17
1 files changed, 12 insertions, 5 deletions
diff --git a/p2p/peer.go b/p2p/peer.go
index 893ba86d7..86c4d7ab5 100644
--- a/p2p/peer.go
+++ b/p2p/peer.go
@@ -300,7 +300,7 @@ func (p *Peer) dispatch(msg Msg, protoDone chan struct{}) (wait bool, err error)
proto.in <- msg
} else {
wait = true
- pr := &eofSignal{msg.Payload, protoDone}
+ pr := &eofSignal{msg.Payload, int64(msg.Size), protoDone}
msg.Payload = pr
proto.in <- msg
}
@@ -438,18 +438,25 @@ func (rw *proto) ReadMsg() (Msg, error) {
return msg, nil
}
-// eofSignal wraps a reader with eof signaling.
-// the eof channel is closed when the wrapped reader
-// reaches EOF.
+// eofSignal wraps a reader with eof signaling. the eof channel is
+// closed when the wrapped reader returns an error or when count bytes
+// have been read.
+//
type eofSignal struct {
wrapped io.Reader
+ count int64
eof chan<- struct{}
}
+// note: when using eofSignal to detect whether a message payload
+// has been read, Read might not be called for zero sized messages.
+
func (r *eofSignal) Read(buf []byte) (int, error) {
n, err := r.wrapped.Read(buf)
- if err != nil {
+ r.count -= int64(n)
+ if (err != nil || r.count <= 0) && r.eof != nil {
r.eof <- struct{}{} // tell Peer that msg has been consumed
+ r.eof = nil
}
return n, err
}