From 19d9cc33e47512bcc24e2ef0f2d2e84ccb3f3e8a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sat, 3 Jan 2015 14:15:43 +0100 Subject: [PATCH] p2p: read/write handshake concurrently This makes it possible to run two base protocols against each other over a MsgPipe. --- p2p/protocol.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/p2p/protocol.go b/p2p/protocol.go index 3f52205f59..d13612fd60 100644 --- a/p2p/protocol.go +++ b/p2p/protocol.go @@ -89,20 +89,26 @@ type baseProtocol struct { func runBaseProtocol(peer *Peer, rw MsgReadWriter) error { bp := &baseProtocol{rw, peer} - if err := bp.doHandshake(rw); err != nil { + errc := make(chan error, 1) + go func() { errc <- rw.WriteMsg(bp.handshakeMsg()) }() + if err := bp.readHandshake(); err != nil { return err } + // handle write error + if err := <-errc; err != nil { + return err + } + // run main loop - quit := make(chan error, 1) go func() { for { if err := bp.handle(rw); err != nil { - quit <- err + errc <- err break } } }() - return bp.loop(quit) + return bp.loop(errc) } var pingTimeout = 2 * time.Second @@ -193,14 +199,9 @@ func (bp *baseProtocol) handle(rw MsgReadWriter) error { return nil } -func (bp *baseProtocol) doHandshake(rw MsgReadWriter) error { - // send our handshake - if err := rw.WriteMsg(bp.handshakeMsg()); err != nil { - return err - } - +func (bp *baseProtocol) readHandshake() error { // read and handle remote handshake - msg, err := rw.ReadMsg() + msg, err := bp.rw.ReadMsg() if err != nil { return err }