summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2018-08-27 10:26:34 -0400
committerNed Batchelder <ned@nedbatchelder.com>2018-08-27 10:26:34 -0400
commit032923e64a98277b13670382cd4324cf1a22438e (patch)
tree8113bf849aa000e1756fcfec5879c0db4954eff5
parentc977402a9c209a9c3ab07e58bcff409c673edd98 (diff)
downloadpython-coveragepy-git-032923e64a98277b13670382cd4324cf1a22438e.tar.gz
SQLite storage detects forks
-rw-r--r--coverage/sqldata.py21
-rw-r--r--tests/test_process.py2
2 files changed, 16 insertions, 7 deletions
diff --git a/coverage/sqldata.py b/coverage/sqldata.py
index 0037d76d..87c15739 100644
--- a/coverage/sqldata.py
+++ b/coverage/sqldata.py
@@ -9,7 +9,6 @@
# TODO: factor out dataop debugging to a wrapper class?
# TODO: make sure all dataop debugging is in place somehow
# TODO: should writes be batched?
-# TODO: settle the os.fork question
# TODO: run_info
import glob
@@ -63,21 +62,28 @@ create table tracer (
class CoverageSqliteData(SimpleRepr):
def __init__(self, basename=None, suffix=None, warn=None, debug=None):
- self.filename = os.path.abspath(basename or ".coverage")
- suffix = filename_suffix(suffix)
- if suffix:
- self.filename += "." + suffix
+ self._basename = os.path.abspath(basename or ".coverage")
+ self._suffix = suffix
self._warn = warn
self._debug = debug
+ self._choose_filename()
self._file_map = {}
self._db = None
+ self._pid = os.getpid()
+
# Are we in sync with the data file?
self._have_used = False
self._has_lines = False
self._has_arcs = False
+ def _choose_filename(self):
+ self.filename = self._basename
+ suffix = filename_suffix(self._suffix)
+ if suffix:
+ self.filename += "." + suffix
+
def _reset(self):
self._file_map = {}
if self._db is not None:
@@ -333,6 +339,11 @@ class CoverageSqliteData(SimpleRepr):
pass
def _start_using(self):
+ if self._pid != os.getpid():
+ # Looks like we forked! Have to start a new data file.
+ self._reset()
+ self._choose_filename()
+ self._pid = os.getpid()
if not self._have_used:
self.erase()
self._have_used = True
diff --git a/tests/test_process.py b/tests/test_process.py
index 1ac18ffe..6174b9f7 100644
--- a/tests/test_process.py
+++ b/tests/test_process.py
@@ -515,8 +515,6 @@ class ProcessTest(CoverageTest):
def test_fork(self):
if not hasattr(os, 'fork'):
self.skipTest("Can't test os.fork since it doesn't exist.")
- # See https://nedbatchelder.com/blog/201808/sqlite_data_storage_for_coveragepy.html
- self.skip_unless_data_storage_is("json")
self.make_file("fork.py", """\
import os