Make "repo sync -j<count>" stop properly on Ctrl-C.

The threaded 'repo sync' implementation would very often freeze the
process when interrupted by the user with Ctrl-C. The only solution
being to kill -9 the process explicitly from another terminal.

The reason for this is best explained here:

http://snakesthatbite.blogspot.fr/2010/09/cpython-threading-interrupting.html

This patch makes all helper sync threads 'daemon', which allows the
process to terminate immediately on Ctrl-C.

Note that this will forcefully kill all threads in case of interruption; this
is generally a bad thing, but:

  1/ This is equivalent to calling kill -9 in another terminal, which
     is the _only_ thing that can currently stop the process.

  2/ There doesn't seem to be a way to tell the worker threads to
     gently stop when they are in a blocking operation anyway (even
     in the non-threaded case).

+ Do the same for "repo status -j<count>".

Change-Id: Ieaf45b0eacee36f35427f8edafd87415c2aa7be4
This commit is contained in:
David 'Digit' Turner 2012-09-05 10:35:06 +02:00 committed by gerrit code review
parent 9a27d0111d
commit e2126652a3
2 changed files with 3 additions and 0 deletions

View File

@ -122,6 +122,7 @@ the following meanings:
t = _threading.Thread(target=self._StatusHelper, t = _threading.Thread(target=self._StatusHelper,
args=(project, counter, sem, output)) args=(project, counter, sem, output))
threads_and_output.append((t, output)) threads_and_output.append((t, output))
t.daemon = True
t.start() t.start()
for (t, output) in threads_and_output: for (t, output) in threads_and_output:
t.join() t.join()

View File

@ -261,6 +261,8 @@ later is required to fix a server side protocol bug.
pm, pm,
sem, sem,
err_event)) err_event))
# Ensure that Ctrl-C will not freeze the repo process.
t.daemon = True
threads.add(t) threads.add(t)
t.start() t.start()