summaryrefslogtreecommitdiff
path: root/coverage/monkey.py
diff options
context:
space:
mode:
Diffstat (limited to 'coverage/monkey.py')
-rw-r--r--coverage/monkey.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/coverage/monkey.py b/coverage/monkey.py
new file mode 100644
index 00000000..42f185ea
--- /dev/null
+++ b/coverage/monkey.py
@@ -0,0 +1,45 @@
+"""Monkey-patching to make coverage 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.
+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, MARKER):
+ return
+
+ if sys.version_info >= (3, 4):
+ klass = multiprocessing.process.BaseProcess
+ else:
+ klass = multiprocessing.Process
+
+ original_bootstrap = klass._bootstrap
+
+ class ProcessWithCoverage(klass):
+ def _bootstrap(self):
+ 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, MARKER, 1)