unlock before sending the message to avoid deadlock

This commit is contained in:
Asim Aslam 2019-09-06 16:57:17 +01:00
parent 5596407144
commit e8aaca27d3

View File

@ -963,26 +963,32 @@ func (n *network) close() error {
// Close closes network connection // Close closes network connection
func (n *network) Close() error { func (n *network) Close() error {
// lock this operation
n.Lock() n.Lock()
defer n.Unlock()
if !n.connected { if !n.connected {
n.Unlock()
return nil return nil
} }
select { select {
case <-n.closed: case <-n.closed:
n.Unlock()
return nil return nil
default: default:
// TODO: send close message to the network channel
close(n.closed)
// set connected to false
n.connected = false
// unlock the lock otherwise we'll deadlock sending the close
n.Unlock()
// send close message only if we managed to connect to NetworkChannel // send close message only if we managed to connect to NetworkChannel
log.Debugf("Sending close message from: %s", n.options.Id) log.Debugf("Sending close message from: %s", n.options.Id)
if err := n.sendMsg("close", NetworkChannel); err != nil { if err := n.sendMsg("close", NetworkChannel); err != nil {
log.Debugf("Network failed to send close message: %s", err) log.Debugf("Network failed to send close message: %s", err)
} }
// TODO: send close message to the network channel
close(n.closed)
// set connected to false
n.connected = false
} }
return n.close() return n.close()