Switch state.py to use sqlite3 instead of filesystem-based stamps.
It passes all tests when run serialized, but still gives weird errors (OperationalError: database is locked) when run with -j5. sqlite3 shouldn't be barfing just because the database is locked, since the default timeout is 5 seconds, and it's dying *way* faster than that.
This commit is contained in:
parent
8dad223225
commit
a62bd50d44
6 changed files with 220 additions and 157 deletions
|
|
@ -4,58 +4,59 @@ import vars, state, builder, jwack
|
|||
from helpers import debug, debug2, err, mkdirp, unlink
|
||||
|
||||
|
||||
def dirty_deps(t, depth):
|
||||
try:
|
||||
st = os.stat(t)
|
||||
realtime = st.st_mtime
|
||||
except OSError:
|
||||
st = None
|
||||
realtime = 0
|
||||
|
||||
debug('%s?%s\n' % (depth, t))
|
||||
if state.isbuilt(t):
|
||||
def dirty_deps(f, depth, max_changed):
|
||||
debug('%s?%s\n' % (depth, f.name))
|
||||
|
||||
if f.changed_runid == None:
|
||||
debug('%s-- DIRTY (never built)\n' % depth)
|
||||
return True
|
||||
if f.changed_runid > max_changed:
|
||||
debug('%s-- DIRTY (built)\n' % depth)
|
||||
return True # has already been built during this session
|
||||
if state.ismarked(t):
|
||||
debug('%s-- CLEAN (marked)\n' % depth)
|
||||
return True # has been built more recently than parent
|
||||
if f.is_checked():
|
||||
debug('%s-- CLEAN (checked)\n' % depth)
|
||||
return False # has already been checked during this session
|
||||
|
||||
stamptime = state.stamped(t)
|
||||
if stamptime == None:
|
||||
|
||||
if not f.stamp:
|
||||
debug('%s-- DIRTY (no stamp)\n' % depth)
|
||||
return True
|
||||
|
||||
if stamptime != realtime and not (st and stat.S_ISDIR(st.st_mode)):
|
||||
if f.stamp != f.read_stamp():
|
||||
debug('%s-- DIRTY (mtime)\n' % depth)
|
||||
return True
|
||||
|
||||
for mode,name in state.deps(t):
|
||||
for mode,name in f.deps():
|
||||
if mode == 'c':
|
||||
if os.path.exists(name):
|
||||
debug('%s-- DIRTY (created)\n' % depth)
|
||||
return True
|
||||
elif mode == 'm':
|
||||
if dirty_deps(os.path.join(vars.BASE, name), depth + ' '):
|
||||
f2 = state.File(name=os.path.join(vars.BASE, name))
|
||||
if dirty_deps(f2, depth = depth + ' ',
|
||||
max_changed = f.changed_runid):
|
||||
debug('%s-- DIRTY (sub)\n' % depth)
|
||||
state.unstamp(t) # optimization for future callers
|
||||
return True
|
||||
state.mark(t)
|
||||
f.set_checked()
|
||||
f.save()
|
||||
return False
|
||||
|
||||
|
||||
def should_build(t):
|
||||
return not state.isbuilt(t) and dirty_deps(t, depth = '')
|
||||
f = state.File(name=t)
|
||||
return dirty_deps(f, depth = '', max_changed = vars.RUNID)
|
||||
|
||||
|
||||
rv = 202
|
||||
try:
|
||||
me = os.path.join(vars.STARTDIR,
|
||||
os.path.join(vars.PWD, vars.TARGET))
|
||||
f = state.File(name=me)
|
||||
debug2('TARGET: %r %r %r\n' % (vars.STARTDIR, vars.PWD, vars.TARGET))
|
||||
try:
|
||||
targets = sys.argv[1:]
|
||||
for t in targets:
|
||||
state.add_dep(me, 'm', t)
|
||||
f.add_dep('m', t)
|
||||
f.save()
|
||||
rv = builder.main(targets, should_build)
|
||||
finally:
|
||||
jwack.force_return_tokens()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue