@@ -1298,10 +1298,19 @@ cdef class Loop:
1298
1298
cdef:
1299
1299
AddrInfo ai_local = None
1300
1300
AddrInfo ai_remote
1301
- system.addrinfo * rai
1302
- system.addrinfo * lai
1303
1301
TCPTransport tr
1304
1302
1303
+ system.addrinfo * rai = NULL
1304
+ system.addrinfo * lai = NULL
1305
+
1306
+ system.addrinfo * rai_iter = NULL
1307
+ system.addrinfo * lai_iter = NULL
1308
+
1309
+ system.addrinfo rai_static
1310
+ system.sockaddr rai_addr_static
1311
+ system.addrinfo lai_static
1312
+ system.sockaddr lai_addr_static
1313
+
1305
1314
object app_protocol
1306
1315
object protocol
1307
1316
object ssl_waiter
@@ -1325,60 +1334,89 @@ cdef class Loop:
1325
1334
raise ValueError (' server_hostname is only meaningful with ssl' )
1326
1335
1327
1336
if host is not None or port is not None :
1328
- f1 = self ._getaddrinfo(host, port, family,
1329
- uv.SOCK_STREAM, proto, flags,
1330
- 0 ) # 0 == don't unpack
1337
+ fs = []
1338
+ f1 = f2 = None
1331
1339
1332
- fs = [f1]
1340
+ try :
1341
+ __static_getaddrinfo(
1342
+ host, port, family, uv.SOCK_STREAM,
1343
+ proto, & rai_addr_static)
1344
+ except LookupError :
1345
+ f1 = self ._getaddrinfo(
1346
+ host, port, family,
1347
+ uv.SOCK_STREAM, proto, flags,
1348
+ 0 ) # 0 == don't unpack
1349
+
1350
+ fs.append(f1)
1351
+ else :
1352
+ rai_static.ai_addr = & rai_addr_static
1353
+ rai_static.ai_next = NULL
1354
+ rai = & rai_static
1333
1355
1334
- f2 = None
1335
1356
if local_addr is not None :
1336
1357
if not isinstance (local_addr, (tuple , list )) or \
1337
1358
len (local_addr) != 2 :
1338
1359
raise ValueError (
1339
1360
' local_addr must be a tuple of host and port' )
1340
1361
1341
- f2 = self ._getaddrinfo(local_addr[0 ], local_addr[1 ], family,
1342
- uv.SOCK_STREAM, proto, flags,
1343
- 0 ) # 0 == don't unpack
1344
- fs.append(f2)
1362
+ try :
1363
+ __static_getaddrinfo(
1364
+ local_addr[0 ], local_addr[1 ],
1365
+ family, uv.SOCK_STREAM,
1366
+ proto, & lai_addr_static)
1367
+ except LookupError :
1368
+ f2 = self ._getaddrinfo(
1369
+ local_addr[0 ], local_addr[1 ], family,
1370
+ uv.SOCK_STREAM, proto, flags,
1371
+ 0 ) # 0 == don't unpack
1372
+
1373
+ fs.append(f2)
1374
+ else :
1375
+ lai_static.ai_addr = & lai_addr_static
1376
+ lai_static.ai_next = NULL
1377
+ lai = & rai_static
1345
1378
1346
- await aio_wait(fs, loop = self )
1379
+ if len (fs):
1380
+ await aio_wait(fs, loop = self )
1347
1381
1348
- ai_remote = f1.result()
1349
- if ai_remote.data is NULL :
1350
- raise OSError (' getaddrinfo() returned empty list' )
1382
+ if rai is NULL :
1383
+ ai_remote = f1.result()
1384
+ if ai_remote.data is NULL :
1385
+ raise OSError (' getaddrinfo() returned empty list' )
1386
+ rai = ai_remote.data
1351
1387
1352
- if f2 is not None :
1388
+ if lai is NULL and f2 is not None :
1353
1389
ai_local = f2.result()
1354
1390
if ai_local.data is NULL :
1355
1391
raise OSError (
1356
1392
' getaddrinfo() returned empty list for local_addr' )
1393
+ lai = ai_local.data
1357
1394
1358
1395
exceptions = []
1359
- rai = ai_remote.data
1360
- while rai is not NULL :
1396
+ rai_iter = rai
1397
+ while rai_iter is not NULL :
1361
1398
tr = None
1362
1399
try :
1363
1400
waiter = self ._new_future()
1364
1401
tr = TCPTransport.new(self , protocol, None , waiter)
1365
- if ai_local is not None :
1366
- lai = ai_local.data
1367
- while lai is not NULL :
1402
+
1403
+ if lai is not NULL :
1404
+ lai_iter = lai
1405
+ while lai_iter is not NULL :
1368
1406
try :
1369
- tr.bind(lai .ai_addr)
1407
+ tr.bind(lai_iter .ai_addr)
1370
1408
break
1371
1409
except OSError as exc:
1372
1410
exceptions.append(exc)
1373
- lai = lai .ai_next
1411
+ lai_iter = lai_iter .ai_next
1374
1412
else :
1375
1413
tr._close()
1376
1414
tr = None
1377
1415
1378
- rai = rai .ai_next
1416
+ rai_iter = rai_iter .ai_next
1379
1417
continue
1380
1418
1381
- tr.connect(rai .ai_addr)
1419
+ tr.connect(rai_iter .ai_addr)
1382
1420
await waiter
1383
1421
1384
1422
except OSError as exc:
@@ -1394,7 +1432,7 @@ cdef class Loop:
1394
1432
else :
1395
1433
break
1396
1434
1397
- rai = rai .ai_next
1435
+ rai_iter = rai_iter .ai_next
1398
1436
1399
1437
else :
1400
1438
# If they all have the same str(), raise one.
0 commit comments