From d2c994e5a461ac74eee58288031265829c96eb8c 2014-10-22 18:27:14 From: Jason Grout Date: 2014-10-22 18:27:14 Subject: [PATCH] Handle some tricky Comm lifecycle issues * If the comm was a primary comm, but there was an error opening it, _closed was False, which is wrong * If Comm.close() was called, but an error happened, it still appeared to be open This change makes the _closed attribute more conservative. If _closed is False, the comm is definitely open for messages. If _closed is True, we either didn't initialize correctly, or we tried to close at some point. --- diff --git a/IPython/kernel/comm/comm.py b/IPython/kernel/comm/comm.py index 4115f19..93e1dec 100644 --- a/IPython/kernel/comm/comm.py +++ b/IPython/kernel/comm/comm.py @@ -42,7 +42,7 @@ class Comm(LoggingConfigurable): _msg_callback = Any() _close_callback = Any() - _closed = Bool(False) + _closed = Bool(True) comm_id = Unicode() def _comm_id_default(self): return uuid.uuid4().hex @@ -56,6 +56,8 @@ class Comm(LoggingConfigurable): if self.primary: # I am primary, open my peer. self.open(data) + else: + self._closed = False def _publish_msg(self, msg_type, data=None, metadata=None, buffers=None, **keys): """Helper for sending a comm message on IOPub""" @@ -86,24 +88,24 @@ class Comm(LoggingConfigurable): "and a comm_manager attached to that kernel.") comm_manager.register_comm(self) - self._closed = False self._publish_msg('comm_open', data=data, metadata=metadata, buffers=buffers, target_name=self.target_name, ) + self._closed = False def close(self, data=None, metadata=None, buffers=None): """Close the frontend-side version of this comm""" if self._closed: # only close once return + self._closed = True if data is None: data = self._close_data self._publish_msg('comm_close', data=data, metadata=metadata, buffers=buffers, ) self.kernel.comm_manager.unregister_comm(self) - self._closed = True def send(self, data=None, metadata=None, buffers=None): """Send a message to the frontend-side version of this comm"""