mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	remove race condition in setting peer.close by requiring it as an argument to newPeer
This commit is contained in:
		
							parent
							
								
									5ddf84f329
								
							
						
					
					
						commit
						2f8dd5dde0
					
				
					 4 changed files with 7 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -97,9 +97,7 @@ func (c *Core) DEBUG_getPeers() *peers {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (ps *peers) DEBUG_newPeer(box crypto.BoxPubKey, sig crypto.SigPubKey, link crypto.BoxSharedKey) *peer {
 | 
			
		||||
	//in <-chan []byte,
 | 
			
		||||
	//out chan<- []byte) *peer {
 | 
			
		||||
	return ps.newPeer(&box, &sig, &link, "(simulator)") //, in, out)
 | 
			
		||||
	return ps.newPeer(&box, &sig, &link, "(simulator)", nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,7 +141,7 @@ func (intf *linkInterface) handler() error {
 | 
			
		|||
	intf.link.mutex.Unlock()
 | 
			
		||||
	// Create peer
 | 
			
		||||
	shared := crypto.GetSharedKey(myLinkPriv, &meta.link)
 | 
			
		||||
	intf.peer = intf.link.core.peers.newPeer(&meta.box, &meta.sig, shared, intf.name)
 | 
			
		||||
	intf.peer = intf.link.core.peers.newPeer(&meta.box, &meta.sig, shared, intf.name, func() { intf.msgIO.close() })
 | 
			
		||||
	if intf.peer == nil {
 | 
			
		||||
		return errors.New("failed to create peer")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -160,13 +160,10 @@ func (intf *linkInterface) handler() error {
 | 
			
		|||
	themAddr := address.AddrForNodeID(crypto.GetNodeID(&intf.info.box))
 | 
			
		||||
	themAddrString := net.IP(themAddr[:]).String()
 | 
			
		||||
	themString := fmt.Sprintf("%s@%s", themAddrString, intf.info.remote)
 | 
			
		||||
	intf.peer.close = func() {
 | 
			
		||||
		intf.msgIO.close()
 | 
			
		||||
		intf.link.core.log.Infof("Disconnected %s: %s, source %s",
 | 
			
		||||
			strings.ToUpper(intf.info.linkType), themString, intf.info.local)
 | 
			
		||||
	}
 | 
			
		||||
	intf.link.core.log.Infof("Connected %s: %s, source %s",
 | 
			
		||||
		strings.ToUpper(intf.info.linkType), themString, intf.info.local)
 | 
			
		||||
	defer intf.link.core.log.Infof("Disconnected %s: %s, source %s",
 | 
			
		||||
		strings.ToUpper(intf.info.linkType), themString, intf.info.local)
 | 
			
		||||
	// Start the link loop
 | 
			
		||||
	go intf.peer.linkLoop()
 | 
			
		||||
	// Start the writer
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,7 +113,7 @@ type peer struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Creates a new peer with the specified box, sig, and linkShared keys, using the lowest unoccupied port number.
 | 
			
		||||
func (ps *peers) newPeer(box *crypto.BoxPubKey, sig *crypto.SigPubKey, linkShared *crypto.BoxSharedKey, endpoint string) *peer {
 | 
			
		||||
func (ps *peers) newPeer(box *crypto.BoxPubKey, sig *crypto.SigPubKey, linkShared *crypto.BoxSharedKey, endpoint string, closer func()) *peer {
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	p := peer{box: *box,
 | 
			
		||||
		sig:        *sig,
 | 
			
		||||
| 
						 | 
				
			
			@ -123,6 +123,7 @@ func (ps *peers) newPeer(box *crypto.BoxPubKey, sig *crypto.SigPubKey, linkShare
 | 
			
		|||
		firstSeen:  now,
 | 
			
		||||
		doSend:     make(chan struct{}, 1),
 | 
			
		||||
		dinfo:      make(chan *dhtInfo, 1),
 | 
			
		||||
		close:      closer,
 | 
			
		||||
		core:       ps.core}
 | 
			
		||||
	ps.mutex.Lock()
 | 
			
		||||
	defer ps.mutex.Unlock()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ func (r *router) init(core *Core) {
 | 
			
		|||
	r.addr = *address.AddrForNodeID(&r.core.dht.nodeID)
 | 
			
		||||
	r.subnet = *address.SubnetForNodeID(&r.core.dht.nodeID)
 | 
			
		||||
	in := make(chan []byte, 32) // TODO something better than this...
 | 
			
		||||
	p := r.core.peers.newPeer(&r.core.boxPub, &r.core.sigPub, &crypto.BoxSharedKey{}, "(self)")
 | 
			
		||||
	p := r.core.peers.newPeer(&r.core.boxPub, &r.core.sigPub, &crypto.BoxSharedKey{}, "(self)", nil)
 | 
			
		||||
	p.out = func(packet []byte) {
 | 
			
		||||
		// This is to make very sure it never blocks
 | 
			
		||||
		select {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue