mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 02:42:27 +00:00
p2p/simulations: changed NewEvent function to be used under network lock to avoid possible data race
This commit is contained in:
parent
1b916f89c1
commit
f1a242793b
2 changed files with 12 additions and 6 deletions
|
|
@ -73,7 +73,8 @@ func NewEvent(v interface{}) *Event {
|
|||
switch v := v.(type) {
|
||||
case *Node:
|
||||
event.Type = EventTypeNode
|
||||
event.Node = v
|
||||
node := *v
|
||||
event.Node = &node
|
||||
case *Conn:
|
||||
event.Type = EventTypeConn
|
||||
conn := *v
|
||||
|
|
|
|||
|
|
@ -168,7 +168,6 @@ func (net *Network) Start(id enode.ID) error {
|
|||
// snapshots
|
||||
func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) error {
|
||||
net.lock.Lock()
|
||||
defer net.lock.Unlock()
|
||||
|
||||
node := net.getNode(id)
|
||||
if node == nil {
|
||||
|
|
@ -184,8 +183,10 @@ func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte)
|
|||
}
|
||||
node.Up = true
|
||||
log.Info("Started node", "id", id)
|
||||
ev := NewEvent(node)
|
||||
net.lock.Unlock()
|
||||
|
||||
net.events.Send(NewEvent(node))
|
||||
net.events.Send(ev)
|
||||
|
||||
// subscribe to peer events
|
||||
client, err := node.Client()
|
||||
|
|
@ -209,13 +210,14 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub
|
|||
|
||||
// assume the node is now down
|
||||
net.lock.Lock()
|
||||
defer net.lock.Unlock()
|
||||
node := net.getNode(id)
|
||||
if node == nil {
|
||||
return
|
||||
}
|
||||
node.Up = false
|
||||
net.events.Send(NewEvent(node))
|
||||
ev := NewEvent(node)
|
||||
net.lock.Unlock()
|
||||
net.events.Send(ev)
|
||||
}()
|
||||
for {
|
||||
select {
|
||||
|
|
@ -270,7 +272,10 @@ func (net *Network) Stop(id enode.ID) error {
|
|||
return err
|
||||
}
|
||||
log.Info("Stopped node", "id", id, "err", err)
|
||||
net.events.Send(ControlEvent(node))
|
||||
net.lock.Lock()
|
||||
ev := ControlEvent(node)
|
||||
net.lock.Unlock()
|
||||
net.events.Send(ev)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue