summaryrefslogtreecommitdiff
path: root/coverage/monkey.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2015-01-30 21:07:25 -0500
committerNed Batchelder <ned@nedbatchelder.com>2015-01-30 21:07:25 -0500
commit3be0790dd8e844ddb597fd09e3d768cbca85ae43 (patch)
tree91a4a613bcab209a232a8a7d7e6759372a7e03db /coverage/monkey.py
parent043d07dee3992d3e7381a41c3ff716234e766a1c (diff)
downloadpython-coveragepy-3be0790dd8e844ddb597fd09e3d768cbca85ae43.tar.gz
Wildly experimental multiprocessing support. Covers most of #117.
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 0000000..42f185e
--- /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)