diff --git a/src/calibre/srv/loop.py b/src/calibre/srv/loop.py index c284b8b7a4..dd17b90279 100644 --- a/src/calibre/srv/loop.py +++ b/src/calibre/srv/loop.py @@ -411,6 +411,7 @@ class ServerLoop: self.ssl_context.set_servername_callback(self.on_ssl_servername) self.pre_activated_socket = None + self.socket_was_preactivated = False if self.opts.allow_socket_preallocation: from calibre.srv.pre_activated import pre_activated_socket self.pre_activated_socket = pre_activated_socket() @@ -501,12 +502,14 @@ class ServerLoop: self.do_bind() else: self.socket = self.pre_activated_socket + self.socket_was_preactivated = True self.pre_activated_socket = None self.setup_socket() def serve(self): self.connection_map = {} - self.socket.listen(min(socket.SOMAXCONN, 128)) + if not self.socket_was_preactivated: + self.socket.listen(min(socket.SOMAXCONN, 128)) self.bound_address = ba = self.socket.getsockname() if isinstance(ba, tuple): ba = ':'.join(map(str, ba)) diff --git a/src/calibre/srv/tests/loop.py b/src/calibre/srv/tests/loop.py index 13870cee1a..a5f3bccc01 100644 --- a/src/calibre/srv/tests/loop.py +++ b/src/calibre/srv/tests/loop.py @@ -214,6 +214,7 @@ class LoopTest(BaseTest): os.closerange(3, 4) # Ensure the socket gets fileno == 3 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) s.bind(('localhost', 0)) + s.listen() # pre-activated sockets are already listening port = s.getsockname()[1] self.ae(s.fileno(), 3) os.environ['LISTEN_PID'] = str(os.getpid())