summaryrefslogtreecommitdiff
path: root/coverage/sqldata.py
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 /coverage/sqldata.py
parentc977402a9c209a9c3ab07e58bcff409c673edd98 (diff)
downloadpython-coveragepy-git-032923e64a98277b13670382cd4324cf1a22438e.tar.gz
SQLite storage detects forks
Diffstat (limited to 'coverage/sqldata.py')
-rw-r--r--coverage/sqldata.py21
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