Another micro-optimization

Also a couple of small bug fixes for unexpected socket death
This commit is contained in:
Kovid Goyal 2015-05-26 08:16:09 +05:30
parent 3e27e0da0f
commit 40791b72b0

View File

@ -391,14 +391,19 @@ class ServerLoop(object):
writable = [] writable = []
else: else:
try: try:
readable, writable, _ = select.select([self.socket] + read_needed, write_needed, [], self.opts.timeout) readable, writable, _ = select.select([self.socket.fileno()] + read_needed, write_needed, [], self.opts.timeout)
except ValueError: # self.socket.fileno() == -1
self.ready = False
self.log.error('Listening socket was unexpectedly terminated')
return
except (select.error, socket.error) as e: except (select.error, socket.error) as e:
if e.errno in socket_errors_eintr: if e.errno in socket_errors_eintr:
return return
for s, conn in tuple(self.connection_map.iteritems()): for s, conn in tuple(self.connection_map.iteritems()):
try: try:
select.select([s], [], [], 0) select.select([s], [], [], 0)
except select.error: except (select.error, socket.error):
if e.errno not in socket_errors_eintr:
self.close(s, conn) # Bad socket, discard self.close(s, conn) # Bad socket, discard
return return
@ -457,11 +462,14 @@ class ServerLoop(object):
conn.close() conn.close()
def get_actions(self, readable, writable): def get_actions(self, readable, writable):
listener = self.socket.fileno()
for s in readable: for s in readable:
if s is self.socket: if s == listener:
s, addr = self.accept() sock, addr = self.accept()
if s is not None: if sock is not None:
self.connection_map[s] = conn = self.handler(s, self.opts, self.ssl_context, self.tdir) s = sock.fileno()
if s > -1:
self.connection_map[s] = conn = self.handler(sock, self.opts, self.ssl_context, self.tdir)
if self.ssl_context is not None: if self.ssl_context is not None:
yield s, conn, RDWR yield s, conn, RDWR
else: else: