|
|
@@ -5,6 +5,7 @@ import (
|
|
|
"blockchain-go/p2p/enode"
|
|
|
"errors"
|
|
|
"sort"
|
|
|
+ "sync"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
@@ -85,7 +86,7 @@ type Peer struct {
|
|
|
closed chan struct{}
|
|
|
disc chan DiscReason
|
|
|
|
|
|
- //wg sync.WaitGroup
|
|
|
+ wg sync.WaitGroup
|
|
|
//log log.Logger
|
|
|
// events receives message send / receive events if set
|
|
|
//events *event.Feed
|
|
|
@@ -108,6 +109,51 @@ func (p *Peer) Inbound() bool {
|
|
|
return p.rw.is(inboundConn)
|
|
|
}
|
|
|
|
|
|
+func (p *Peer) run() (remoteRequested bool, err error) {
|
|
|
+ var (
|
|
|
+ writeStart = make(chan struct{}, 1)
|
|
|
+ writeErr = make(chan error, 1)
|
|
|
+ readErr = make(chan error, 1)
|
|
|
+ reason DiscReason
|
|
|
+ )
|
|
|
+
|
|
|
+ p.wg.Add(2)
|
|
|
+
|
|
|
+ writeStart <- struct{}{}
|
|
|
+
|
|
|
+loop:
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case err = <-writeErr:
|
|
|
+ if err != nil {
|
|
|
+ reason = DiscNetworkError
|
|
|
+ break loop
|
|
|
+ }
|
|
|
+ writeStart <- struct{}{}
|
|
|
+ case err = <-readErr:
|
|
|
+ if r, ok := err.(DiscReason); ok {
|
|
|
+ remoteRequested = true
|
|
|
+ reason = r
|
|
|
+ } else {
|
|
|
+ reason = DiscNetworkError
|
|
|
+ }
|
|
|
+ break loop
|
|
|
+ case err = <-p.protoErr:
|
|
|
+ reason = discReasonForError(err)
|
|
|
+ break loop
|
|
|
+ case err = <-p.disc:
|
|
|
+ reason = discReasonForError(err)
|
|
|
+ break loop
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ close(p.closed)
|
|
|
+ p.rw.close(reason)
|
|
|
+ p.wg.Wait()
|
|
|
+
|
|
|
+ return remoteRequested, err
|
|
|
+}
|
|
|
+
|
|
|
type protoRW struct {
|
|
|
Protocol
|
|
|
in chan Msg // receives read messages
|