[Python-checkins] cpython: Issue #23680: Reduce risk of race condition in check_interrupted_write_retry()

victor.stinner python-checkins at python.org
Mon Mar 16 17:58:35 CET 2015


https://hg.python.org/cpython/rev/a18f7508649b
changeset:   95008:a18f7508649b
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Mon Mar 16 17:57:49 2015 +0100
summary:
  Issue #23680: Reduce risk of race condition in check_interrupted_write_retry()
of test_io. Allocate the large data before scheduling an alarm in 1 second.

On very slow computer, the alarm rings sometimes during the memory allocation.

files:
  Lib/test/test_io.py |  9 ++++++++-
  1 files changed, 8 insertions(+), 1 deletions(-)


diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -3544,11 +3544,13 @@
         returning a partial result or EINTR), properly invokes the signal
         handler and retries if the latter returned successfully."""
         select = support.import_module("select")
+
         # A quantity that exceeds the buffer size of an anonymous pipe's
         # write end.
         N = support.PIPE_MAX_SIZE
         r, w = os.pipe()
         fdopen_kwargs["closefd"] = False
+
         # We need a separate thread to read from the pipe and allow the
         # write() to finish.  This thread is started after the SIGALRM is
         # received (forcing a first EINTR in write()).
@@ -3566,6 +3568,8 @@
             signal.alarm(1)
         def alarm2(sig, frame):
             t.start()
+
+        large_data = item * N
         signal.signal(signal.SIGALRM, alarm1)
         try:
             wio = self.io.open(w, **fdopen_kwargs)
@@ -3575,10 +3579,13 @@
             #   and the first alarm)
             # - second raw write() returns EINTR (because of the second alarm)
             # - subsequent write()s are successful (either partial or complete)
-            self.assertEqual(N, wio.write(item * N))
+            written = wio.write(large_data)
+            self.assertEqual(N, written)
+
             wio.flush()
             write_finished = True
             t.join()
+
             self.assertEqual(N, sum(len(x) for x in read_results))
         finally:
             write_finished = True

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list