Unverified Kaydet (Commit) 05c9d31e authored tarafından Victor Stinner's avatar Victor Stinner Kaydeden (comit) GitHub

bpo-31731: Fix test_io.check_interrupted_write() (GH-11225)

Fix a race condition in check_interrupted_write() of test_io:
create directly the thread with SIGALRM signal blocked,
rather than blocking the signal later from the thread. Previously, it
was possible that the thread gets the signal before the signal is
blocked.
üst b5c8cfa1
...@@ -4149,10 +4149,9 @@ class SignalsTest(unittest.TestCase): ...@@ -4149,10 +4149,9 @@ class SignalsTest(unittest.TestCase):
in the latter.""" in the latter."""
read_results = [] read_results = []
def _read(): def _read():
if hasattr(signal, 'pthread_sigmask'):
signal.pthread_sigmask(signal.SIG_BLOCK, [signal.SIGALRM])
s = os.read(r, 1) s = os.read(r, 1)
read_results.append(s) read_results.append(s)
t = threading.Thread(target=_read) t = threading.Thread(target=_read)
t.daemon = True t.daemon = True
r, w = os.pipe() r, w = os.pipe()
...@@ -4160,7 +4159,14 @@ class SignalsTest(unittest.TestCase): ...@@ -4160,7 +4159,14 @@ class SignalsTest(unittest.TestCase):
large_data = item * (support.PIPE_MAX_SIZE // len(item) + 1) large_data = item * (support.PIPE_MAX_SIZE // len(item) + 1)
try: try:
wio = self.io.open(w, **fdopen_kwargs) wio = self.io.open(w, **fdopen_kwargs)
t.start() if hasattr(signal, 'pthread_sigmask'):
# create the thread with SIGALRM signal blocked
signal.pthread_sigmask(signal.SIG_BLOCK, [signal.SIGALRM])
t.start()
signal.pthread_sigmask(signal.SIG_UNBLOCK, [signal.SIGALRM])
else:
t.start()
# Fill the pipe enough that the write will be blocking. # Fill the pipe enough that the write will be blocking.
# It will be interrupted by the timer armed above. Since the # It will be interrupted by the timer armed above. Since the
# other thread has read one byte, the low-level write will # other thread has read one byte, the low-level write will
......
Fix a race condition in ``check_interrupted_write()`` of test_io: create
directly the thread with SIGALRM signal blocked, rather than blocking the
signal later from the thread. Previously, it was possible that the thread gets
the signal before the signal is blocked.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment