skyfffire 2 жил өмнө
parent
commit
b16943176f
1 өөрчлөгдсөн 47 нэмэгдсэн , 1 устгасан
  1. 47 1
      p2p/peer.go

+ 47 - 1
p2p/peer.go

@@ -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