@@ -168,24 +168,28 @@ func (net *Network) Start(id enode.ID) error {
168168// snapshots
169169func (net * Network ) startWithSnapshots (id enode.ID , snapshots map [string ][]byte ) error {
170170 net .lock .Lock ()
171- defer net .lock .Unlock ()
172171
173172 node := net .getNode (id )
174173 if node == nil {
174+ net .lock .Unlock ()
175175 return fmt .Errorf ("node %v does not exist" , id )
176176 }
177177 if node .Up {
178+ net .lock .Unlock ()
178179 return fmt .Errorf ("node %v already up" , id )
179180 }
180181 log .Trace ("Starting node" , "id" , id , "adapter" , net .nodeAdapter .Name ())
181182 if err := node .Start (snapshots ); err != nil {
183+ net .lock .Unlock ()
182184 log .Warn ("Node startup failed" , "id" , id , "err" , err )
183185 return err
184186 }
185187 node .Up = true
186188 log .Info ("Started node" , "id" , id )
189+ ev := NewEvent (node )
190+ net .lock .Unlock ()
187191
188- net .events .Send (NewEvent ( node ) )
192+ net .events .Send (ev )
189193
190194 // subscribe to peer events
191195 client , err := node .Client ()
@@ -210,12 +214,14 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub
210214 // assume the node is now down
211215 net .lock .Lock ()
212216 defer net .lock .Unlock ()
217+
213218 node := net .getNode (id )
214219 if node == nil {
215220 return
216221 }
217222 node .Up = false
218- net .events .Send (NewEvent (node ))
223+ ev := NewEvent (node )
224+ net .events .Send (ev )
219225 }()
220226 for {
221227 select {
@@ -254,9 +260,11 @@ func (net *Network) Stop(id enode.ID) error {
254260 net .lock .Lock ()
255261 node := net .getNode (id )
256262 if node == nil {
263+ net .lock .Unlock ()
257264 return fmt .Errorf ("node %v does not exist" , id )
258265 }
259266 if ! node .Up {
267+ net .lock .Unlock ()
260268 return fmt .Errorf ("node %v already down" , id )
261269 }
262270 node .Up = false
@@ -270,7 +278,10 @@ func (net *Network) Stop(id enode.ID) error {
270278 return err
271279 }
272280 log .Info ("Stopped node" , "id" , id , "err" , err )
273- net .events .Send (ControlEvent (node ))
281+ net .lock .Lock ()
282+ ev := ControlEvent (node )
283+ net .lock .Unlock ()
284+ net .events .Send (ev )
274285 return nil
275286}
276287
0 commit comments