diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2018-08-27 10:26:34 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2018-08-27 10:26:34 -0400 |
commit | 032923e64a98277b13670382cd4324cf1a22438e (patch) | |
tree | 8113bf849aa000e1756fcfec5879c0db4954eff5 | |
parent | c977402a9c209a9c3ab07e58bcff409c673edd98 (diff) | |
download | python-coveragepy-git-032923e64a98277b13670382cd4324cf1a22438e.tar.gz |
SQLite storage detects forks
-rw-r--r-- | coverage/sqldata.py | 21 | ||||
-rw-r--r-- | tests/test_process.py | 2 |
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 |