[Lldb-commits] [lldb] r249182 - Fix race on subprocess.Popen return values.
Todd Fiala via lldb-commits
lldb-commits at lists.llvm.org
Fri Oct 2 13:51:12 PDT 2015
Author: tfiala
Date: Fri Oct 2 15:51:11 2015
New Revision: 249182
URL: http://llvm.org/viewvc/llvm-project?rev=249182&view=rev
Log:
Fix race on subprocess.Popen return values.
This fixes:
https://llvm.org/bugs/show_bug.cgi?id=25019
Modified:
lldb/trunk/test/test_runner/lib/process_control.py
lldb/trunk/test/test_runner/test/process_control_tests.py
Modified: lldb/trunk/test/test_runner/lib/process_control.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/test_runner/lib/process_control.py?rev=249182&r1=249181&r2=249182&view=diff
==============================================================================
--- lldb/trunk/test/test_runner/lib/process_control.py (original)
+++ lldb/trunk/test/test_runner/lib/process_control.py Fri Oct 2 15:51:11 2015
@@ -611,3 +611,48 @@ class ProcessDriver(object):
self.io_thread.output,
not completed_normally,
self.returncode)
+
+
+def patched_init(self, *args, **kwargs):
+ self.original_init(*args, **kwargs)
+ # Initialize our condition variable that protects wait()/poll().
+ self.wait_condition = threading.Condition()
+
+
+def patched_wait(self):
+ self.wait_condition.acquire()
+ try:
+ result = self.original_wait()
+ # The process finished. Signal the condition.
+ self.wait_condition.notify_all()
+ return result
+ finally:
+ self.wait_condition.release()
+
+
+def patched_poll(self):
+ self.wait_condition.acquire()
+ try:
+ result = self.original_poll()
+ if self.returncode is not None:
+ # We did complete, and we have the return value.
+ # Signal the event to indicate we're done.
+ self.wait_condition.notify_all()
+ return result
+ finally:
+ self.wait_condition.release()
+
+
+def patch_up_subprocess_popen():
+ subprocess.Popen.original_init = subprocess.Popen.__init__
+ subprocess.Popen.__init__ = patched_init
+
+ subprocess.Popen.original_wait = subprocess.Popen.wait
+ subprocess.Popen.wait = patched_wait
+
+ subprocess.Popen.original_poll = subprocess.Popen.poll
+ subprocess.Popen.poll = patched_poll
+
+# Replace key subprocess.Popen() threading-unprotected methods with
+# threading-protected versions.
+patch_up_subprocess_popen()
Modified: lldb/trunk/test/test_runner/test/process_control_tests.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/test_runner/test/process_control_tests.py?rev=249182&r1=249181&r2=249182&view=diff
==============================================================================
--- lldb/trunk/test/test_runner/test/process_control_tests.py (original)
+++ lldb/trunk/test/test_runner/test/process_control_tests.py Fri Oct 2 15:51:11 2015
@@ -202,6 +202,9 @@ class ProcessControlTimeoutTests(Process
"""inferior exit detected when inferior children are live with shared
stdout/stderr handles.
"""
+ # Requires review D13362 or equivalent to be implemented.
+ self.skipTest("http://reviews.llvm.org/D13362")
+
driver = TestInferiorDriver()
# Create the inferior (I1), and instruct it to create a child (C1)
@@ -220,7 +223,7 @@ class ProcessControlTimeoutTests(Process
"process failed to complete")
# Ensure we didn't receive a timeout.
- self.assertTrue(
+ self.assertFalse(
driver.was_timeout, "inferior should have completed normally")
self.assertEqual(
More information about the lldb-commits
mailing list