Index: tools/telemetry/third_party/coverage/coverage/monkey.py |
diff --git a/tools/telemetry/third_party/coverage/coverage/monkey.py b/tools/telemetry/third_party/coverage/coverage/monkey.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c4ec68c66807a147ec095b36f21f681ac584a30e |
--- /dev/null |
+++ b/tools/telemetry/third_party/coverage/coverage/monkey.py |
@@ -0,0 +1,50 @@ |
+# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 |
+# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt |
+ |
+"""Monkey-patching to make coverage.py work right in some cases.""" |
+ |
+import multiprocessing |
+import multiprocessing.process |
+import sys |
+ |
+# An attribute that will be set on modules to indicate that they have been |
+# monkey-patched. |
+PATCHED_MARKER = "_coverage$patched" |
+ |
+ |
+def patch_multiprocessing(): |
+ """Monkey-patch the multiprocessing module. |
+ |
+ This enables coverage measurement of processes started by multiprocessing. |
+ This is wildly experimental! |
+ |
+ """ |
+ if hasattr(multiprocessing, PATCHED_MARKER): |
+ return |
+ |
+ if sys.version_info >= (3, 4): |
+ klass = multiprocessing.process.BaseProcess |
+ else: |
+ klass = multiprocessing.Process |
+ |
+ original_bootstrap = klass._bootstrap |
+ |
+ class ProcessWithCoverage(klass): |
+ """A replacement for multiprocess.Process that starts coverage.""" |
+ def _bootstrap(self): |
+ """Wrapper around _bootstrap to start coverage.""" |
+ from coverage import Coverage |
+ cov = Coverage(data_suffix=True) |
+ cov.start() |
+ try: |
+ return original_bootstrap(self) |
+ finally: |
+ cov.stop() |
+ cov.save() |
+ |
+ if sys.version_info >= (3, 4): |
+ klass._bootstrap = ProcessWithCoverage._bootstrap |
+ else: |
+ multiprocessing.Process = ProcessWithCoverage |
+ |
+ setattr(multiprocessing, PATCHED_MARKER, True) |