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) {
|
switch v := v.(type) {
|
||||||
case *Node:
|
case *Node:
|
||||||
event.Type = EventTypeNode
|
event.Type = EventTypeNode
|
||||||
event.Node = v
|
node := *v
|
||||||
|
event.Node = &node
|
||||||
case *Conn:
|
case *Conn:
|
||||||
event.Type = EventTypeConn
|
event.Type = EventTypeConn
|
||||||
conn := *v
|
conn := *v
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,6 @@ func (net *Network) Start(id enode.ID) error {
|
||||||
// snapshots
|
// snapshots
|
||||||
func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) error {
|
func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) error {
|
||||||
net.lock.Lock()
|
net.lock.Lock()
|
||||||
defer net.lock.Unlock()
|
|
||||||
|
|
||||||
node := net.getNode(id)
|
node := net.getNode(id)
|
||||||
if node == nil {
|
if node == nil {
|
||||||
|
|
@ -184,8 +183,10 @@ func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte)
|
||||||
}
|
}
|
||||||
node.Up = true
|
node.Up = true
|
||||||
log.Info("Started node", "id", id)
|
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
|
// subscribe to peer events
|
||||||
client, err := node.Client()
|
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
|
// assume the node is now down
|
||||||
net.lock.Lock()
|
net.lock.Lock()
|
||||||
defer net.lock.Unlock()
|
|
||||||
node := net.getNode(id)
|
node := net.getNode(id)
|
||||||
if node == nil {
|
if node == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
node.Up = false
|
node.Up = false
|
||||||
net.events.Send(NewEvent(node))
|
ev := NewEvent(node)
|
||||||
|
net.lock.Unlock()
|
||||||
|
net.events.Send(ev)
|
||||||
}()
|
}()
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
|
@ -270,7 +272,10 @@ func (net *Network) Stop(id enode.ID) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Info("Stopped node", "id", id, "err", 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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue