diff --git a/mitogen/core.py b/mitogen/core.py index 8b81fc45..1bb4a1ee 100644 --- a/mitogen/core.py +++ b/mitogen/core.py @@ -1008,12 +1008,14 @@ class Latch(object): return len(self._queue) == 0 def _tls_init(self): - if self._sockets: + # pop() must be atomic, which is true for GIL-equipped interpreters. + try: return self._sockets.pop() - rsock, wsock = socket.socketpair() - set_cloexec(rsock.fileno()) - set_cloexec(wsock.fileno()) - return rsock, wsock + except IndexError: + rsock, wsock = socket.socketpair() + set_cloexec(rsock.fileno()) + set_cloexec(wsock.fileno()) + return rsock, wsock def get(self, timeout=None, block=True): _vv and IOLOG.debug('%r.get(timeout=%r, block=%r)', diff --git a/mitogen/parent.py b/mitogen/parent.py index eae9ee6c..497ccd0a 100644 --- a/mitogen/parent.py +++ b/mitogen/parent.py @@ -798,7 +798,6 @@ class Context(mitogen.core.Context): LOG.debug('%r.shutdown() sending SHUTDOWN', self) latch = mitogen.core.Latch() mitogen.core.listen(self, 'disconnect', lambda: latch.put(None)) - self.send( mitogen.core.Message( handle=mitogen.core.SHUTDOWN, @@ -807,6 +806,7 @@ class Context(mitogen.core.Context): if wait: latch.get() + return latch class RouteMonitor(object):