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 /coverage/sqldata.py | |
parent | c977402a9c209a9c3ab07e58bcff409c673edd98 (diff) | |
download | python-coveragepy-git-032923e64a98277b13670382cd4324cf1a22438e.tar.gz |
SQLite storage detects forks
Diffstat (limited to 'coverage/sqldata.py')
-rw-r--r-- | coverage/sqldata.py | 21 |
1 files changed, 16 insertions, 5 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 |