-
-
Notifications
You must be signed in to change notification settings - Fork 33.7k
Closed
Labels
Description
The test_asyncio.test_sock_lowlevel.py test uses a UDP echo server:
cpython/Lib/test/test_asyncio/utils.py
Lines 288 to 310 in a15fede
| def echo_datagrams(sock): | |
| while True: | |
| data, addr = sock.recvfrom(4096) | |
| if data == b'STOP': | |
| sock.close() | |
| break | |
| else: | |
| sock.sendto(data, addr) | |
| @contextlib.contextmanager | |
| def run_udp_echo_server(*, host='127.0.0.1', port=0): | |
| addr_info = socket.getaddrinfo(host, port, type=socket.SOCK_DGRAM) | |
| family, type, proto, _, sockaddr = addr_info[0] | |
| sock = socket.socket(family, type, proto) | |
| sock.bind((host, port)) | |
| thread = threading.Thread(target=lambda: echo_datagrams(sock)) | |
| thread.start() | |
| try: | |
| yield sock.getsockname() | |
| finally: | |
| sock.sendto(b'STOP', sock.getsockname()) | |
| thread.join() |
Thread sanitizer complains about the sock.sendto(b'STOP', sock.getsockname()) line in the main thread happening concurrently with the sock.close() in the echo_datagrams thread.
This seems a bit bogus to me: the sendto has to start before the close starts because it triggers the echo_datagrams shutdown, but it's easy enough to avoid the data race. I also think it's better in this case to do a small code change to the test, instead of adding or keeping a global suppression.