Add cyclic dependence detection.
If a depends on b which depends on a, redo would just freeze. Now it aborts with a somewhat helpful error message. [Updated by apenwarr for coding style and to add a test.]
This commit is contained in:
parent
63f9dcb640
commit
7dd63efb37
8 changed files with 32 additions and 1 deletions
|
|
@ -206,6 +206,7 @@ class BuildJob:
|
|||
os.environ['REDO_PWD'] = state.relpath(newp, vars.STARTDIR)
|
||||
os.environ['REDO_TARGET'] = self.basename + self.ext
|
||||
os.environ['REDO_DEPTH'] = vars.DEPTH + ' '
|
||||
vars.add_lock(str(self.lock.fid))
|
||||
if dn:
|
||||
os.chdir(dn)
|
||||
os.dup2(self.f.fileno(), 1)
|
||||
|
|
@ -378,7 +379,13 @@ def main(targets, shouldbuildfunc):
|
|||
# be released; but we should never run get_token() while
|
||||
# holding a lock, or we could cause deadlocks.
|
||||
jwack.release_mine()
|
||||
lock.waitlock()
|
||||
try:
|
||||
lock.waitlock()
|
||||
except state.CyclicDependencyError:
|
||||
err('cyclic dependency while building %s\n' % _nice(t))
|
||||
jwack.get_token(t)
|
||||
retcode[0] = 208
|
||||
return retcode[0]
|
||||
lock.unlock()
|
||||
jwack.get_token(t)
|
||||
lock.trylock()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue