Skip to content

Commit bf13b76

Browse files
committed
Refactor loop.create_server: factor out the instantiation of TCPServer
1 parent 14d83c1 commit bf13b76

File tree

2 files changed

+50
-30
lines changed

2 files changed

+50
-30
lines changed

uvloop/loop.pxd

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,13 @@ cdef class Loop:
149149

150150
cdef _getnameinfo(self, system.sockaddr *addr, int flags)
151151

152+
cdef _create_server(self, system.sockaddr *addr,
153+
object protocol_factory,
154+
Server server,
155+
object ssl,
156+
bint reuse_port,
157+
object backlog)
158+
152159
cdef _add_reader(self, fd, Handle handle)
153160
cdef _remove_reader(self, fd)
154161

uvloop/loop.pyx

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,45 @@ cdef class Loop:
768768
sys_set_coroutine_wrapper(None)
769769
self._coroutine_wrapper_set = False
770770

771+
cdef _create_server(self, system.sockaddr *addr,
772+
object protocol_factory,
773+
Server server,
774+
object ssl,
775+
bint reuse_port,
776+
object backlog):
777+
cdef:
778+
TCPServer tcp
779+
int bind_flags
780+
781+
tcp = TCPServer.new(self, protocol_factory, server, ssl,
782+
addr.sa_family)
783+
784+
if reuse_port:
785+
self._sock_set_reuseport(tcp._fileno())
786+
787+
if addr.sa_family== uv.AF_INET6:
788+
# Disable IPv4/IPv6 dual stack support (enabled by
789+
# default on Linux) which makes a single socket
790+
# listen on both address families.
791+
bind_flags = uv.UV_TCP_IPV6ONLY
792+
else:
793+
bind_flags = 0
794+
795+
try:
796+
tcp.bind(addr, bind_flags)
797+
tcp.listen(backlog)
798+
except OSError as err:
799+
pyaddr = __convert_sockaddr_to_pyaddr(addr)
800+
tcp._close()
801+
raise OSError(err.errno, 'error while attempting '
802+
'to bind on address %r: %s'
803+
% (pyaddr, err.strerror.lower()))
804+
except:
805+
tcp._close()
806+
raise
807+
808+
return tcp
809+
771810
IF DEBUG:
772811
def print_debug_info(self):
773812
cdef:
@@ -1170,7 +1209,6 @@ cdef class Loop:
11701209
TCPServer tcp
11711210
system.addrinfo *addrinfo
11721211
Server server = Server(self)
1173-
int bind_flags
11741212

11751213
if ssl is not None and not isinstance(ssl, ssl_SSLContext):
11761214
raise TypeError('ssl argument must be an SSLContext or None')
@@ -1206,36 +1244,11 @@ cdef class Loop:
12061244
if addrinfo.ai_family == uv.AF_UNSPEC:
12071245
raise RuntimeError('AF_UNSPEC in DNS results')
12081246

1209-
tcp = TCPServer.new(
1210-
self, protocol_factory, server, ssl,
1211-
addrinfo.ai_family)
1212-
1213-
if reuse_port:
1214-
self._sock_set_reuseport(tcp._fileno())
1247+
tcp = self._create_server(
1248+
addrinfo.ai_addr, protocol_factory, server,
1249+
ssl, reuse_port, backlog)
12151250

1216-
if addrinfo.ai_family == uv.AF_INET6:
1217-
# Disable IPv4/IPv6 dual stack support (enabled by
1218-
# default on Linux) which makes a single socket
1219-
# listen on both address families.
1220-
bind_flags = uv.UV_TCP_IPV6ONLY
1221-
else:
1222-
bind_flags = 0
1223-
1224-
try:
1225-
tcp.bind(addrinfo.ai_addr, bind_flags)
1226-
tcp.listen(backlog)
1227-
except OSError as err:
1228-
pyaddr = __convert_sockaddr_to_pyaddr(
1229-
<system.sockaddr*>addrinfo.ai_addr)
1230-
tcp._close()
1231-
raise OSError(err.errno, 'error while attempting '
1232-
'to bind on address %r: %s'
1233-
% (pyaddr, err.strerror.lower()))
1234-
except:
1235-
tcp._close()
1236-
raise
1237-
1238-
server._add_server(tcp)
1251+
server._add_server(<TCPServer>tcp)
12391252

12401253
addrinfo = addrinfo.ai_next
12411254

0 commit comments

Comments
 (0)