mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 23:26:44 +00:00
p2p/protocols: Wait for handshake to be sent before returning
Signed-off-by: Lewis Marshall <lewis@lmars.net>
This commit is contained in:
parent
e145bda359
commit
5d8c55b077
1 changed files with 13 additions and 18 deletions
|
|
@ -280,29 +280,24 @@ func (self *Peer) Handshake(ctx context.Context, hs interface{}) (interface{}, e
|
|||
}
|
||||
errc := make(chan error, 2)
|
||||
go func() {
|
||||
if err := self.Send(hs); err != nil {
|
||||
errc <- errorf(ErrHandshake, "cannot send: %v", err)
|
||||
}
|
||||
errc <- self.Send(hs)
|
||||
}()
|
||||
hsc := make(chan interface{})
|
||||
var rhs interface{}
|
||||
go func() {
|
||||
var rhs interface{}
|
||||
err := self.handleIncoming(func(msg interface{}) error {
|
||||
errc <- self.handleIncoming(func(msg interface{}) error {
|
||||
rhs = msg
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
errc <- err
|
||||
return
|
||||
}
|
||||
hsc <- rhs
|
||||
}()
|
||||
select {
|
||||
case rhs := <-hsc:
|
||||
return rhs, nil
|
||||
case <-ctx.Done():
|
||||
return nil, ctx.Err()
|
||||
case err := <-errc:
|
||||
return nil, err
|
||||
for i := 0; i < 2; i++ {
|
||||
select {
|
||||
case err := <-errc:
|
||||
if err != nil {
|
||||
return nil, errorf(ErrHandshake, err.Error())
|
||||
}
|
||||
case <-ctx.Done():
|
||||
return nil, ctx.Err()
|
||||
}
|
||||
}
|
||||
return rhs, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue