Skip to content

[3.12] gh-76106: Remove the cleanup lock in test_socket (GH-110539) #110699

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 11, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 2 additions & 24 deletions Lib/test/test_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,26 +215,6 @@ def setUp(self):
self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
self.port = socket_helper.bind_port(self.serv)

class ThreadSafeCleanupTestCase:
"""Subclass of unittest.TestCase with thread-safe cleanup methods.

This subclass protects the addCleanup() method with a recursive lock.

doCleanups() is called when the server completed, but the client can still
be running in its thread especially if the server failed with a timeout.
Don't put a lock on doCleanups() to prevent deadlock between addCleanup()
called in the client and doCleanups() waiting for self.done.wait of
ThreadableTest._setUp() (gh-110167)
"""

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._cleanup_lock = threading.RLock()

def addCleanup(self, *args, **kwargs):
with self._cleanup_lock:
return super().addCleanup(*args, **kwargs)


class SocketCANTest(unittest.TestCase):

Expand Down Expand Up @@ -628,8 +608,7 @@ def setUp(self):
self.serv.listen()


class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
ThreadableTest):
class ThreadedSocketTestMixin(SocketTestBase, ThreadableTest):
"""Mixin to add client socket and allow client/server tests.

Client socket is self.cli and its address is self.cli_addr. See
Expand Down Expand Up @@ -2815,7 +2794,7 @@ def _testRecvFromNegative(self):
# here assumes that datagram delivery on the local machine will be
# reliable.

class SendrecvmsgBase(ThreadSafeCleanupTestCase):
class SendrecvmsgBase:
# Base class for sendmsg()/recvmsg() tests.

# Time in seconds to wait before considering a test failed, or
Expand Down Expand Up @@ -4681,7 +4660,6 @@ def testInterruptedRecvmsgIntoTimeout(self):
@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
"Don't have signal.alarm or signal.setitimer")
class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
ThreadSafeCleanupTestCase,
SocketListeningTestMixin, TCPTestBase):
# Test interrupting the interruptible send*() methods with signals
# when a timeout is set.
Expand Down