From 3f9aa8d8fa328fee897d0295fb8024f1cf67c9f4 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 8 Feb 2018 13:09:46 +0400 Subject: [PATCH] document that msgBytes in p2p/connection change --- p2p/base_reactor.go | 5 ++++- p2p/conn/connection.go | 8 ++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/p2p/base_reactor.go b/p2p/base_reactor.go index 8217d46b..f0dd1414 100644 --- a/p2p/base_reactor.go +++ b/p2p/base_reactor.go @@ -23,7 +23,10 @@ type Reactor interface { // Receive is called when msgBytes is received from peer. // - // CONTRACT: msgBytes are not nil + // NOTE reactor can not keep msgBytes around after Receive completes without + // copying. + // + // CONTRACT: msgBytes are not nil. Receive(chID byte, peer Peer, msgBytes []byte) } diff --git a/p2p/conn/connection.go b/p2p/conn/connection.go index 6b491250..7727ee32 100644 --- a/p2p/conn/connection.go +++ b/p2p/conn/connection.go @@ -679,7 +679,8 @@ func writeMsgPacketTo(packet msgPacket, w io.Writer, n *int, err *error) { wire.WriteBinary(packet, w, n, err) } -// Handles incoming msgPackets. Returns a msg bytes if msg is complete. +// Handles incoming msgPackets. It returns a message bytes if message is +// complete. NOTE message bytes may change on next call to recvMsgPacket. // Not goroutine-safe func (ch *Channel) recvMsgPacket(packet msgPacket) ([]byte, error) { ch.Logger.Debug("Read Msg Packet", "conn", ch.conn, "packet", packet) @@ -688,11 +689,6 @@ func (ch *Channel) recvMsgPacket(packet msgPacket) ([]byte, error) { } ch.recving = append(ch.recving, packet.Bytes...) if packet.EOF == byte(0x01) { - // TODO: document that these returned msgBytes will change under you after Receive finishes. - // TODO: document it in the Reactor interface especially - implementations of a Reactor - // can not keep these bytes around after the Receive completes without copying! - // In general that's fine, because the first thing we do is unmarshal into a msg type and then - // we never use the bytes again msgBytes := ch.recving // clear the slice without re-allocating.