diff options
-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 |