Merge pull request #742 from micro/unlock
unlock before sending the message to avoid deadlock
This commit is contained in:
		| @@ -963,26 +963,32 @@ func (n *network) close() error { | ||||
|  | ||||
| // Close closes network connection | ||||
| func (n *network) Close() error { | ||||
| 	// lock this operation | ||||
| 	n.Lock() | ||||
| 	defer n.Unlock() | ||||
|  | ||||
| 	if !n.connected { | ||||
| 		n.Unlock() | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	select { | ||||
| 	case <-n.closed: | ||||
| 		n.Unlock() | ||||
| 		return nil | ||||
| 	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 | ||||
| 		log.Debugf("Sending close message from: %s", n.options.Id) | ||||
| 		if err := n.sendMsg("close", NetworkChannel); err != nil { | ||||
| 			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() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user