Skip to content

Commit

Permalink
fix Ctrl-C / SIGINT behaviour for pyinstaller-made binaries, fixes bo…
Browse files Browse the repository at this point in the history
  • Loading branch information
ThomasWaldmann committed Mar 28, 2024
1 parent 07747c0 commit e7f7c39
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions src/borg/helpers/process.py
Expand Up @@ -188,6 +188,9 @@ def __init__(self):
self._action_triggered = False
self._action_done = False
self.ctx = signal_handler('SIGINT', self.handler)
self.debounce_interval = 20000000 # ns
self.last = time.monotonic_ns() - self.debounce_interval # monotonic time when we last processed SIGINT
self.count = 0 # how many SIGINT did we process?

def __bool__(self):
# this will be True (and stay True) after the first Ctrl-C/SIGINT
Expand All @@ -208,10 +211,24 @@ def action_completed(self):
self._action_done = True

def handler(self, sig_no, stack):
# handle the first ctrl-c / SIGINT.
self.__exit__(None, None, None)
self._sig_int_triggered = True
self._action_triggered = True
# ignore a SIGINT if it comes too quickly after the last one, e.g. because it
# was caused by the same Ctrl-C key press and a parent process forwarded it to us.
# this can easily happen for the pyinstaller-made binaries because the bootloader
# process and the borg process are in same process group (see #8155), but maybe also
# under other circumstances.
now = time.monotonic_ns()
if now - self.last >= self.debounce_interval:
self.last = now
self.count += 1
if self.count == 1: # first SIGINT
self._sig_int_triggered = True
self._action_triggered = True
else: # second SIGINT
# restore the original signal handler for the 3rd+ SIGINT -
# this implies that this handler here loses control!
self.__exit__(None, None, None)
# handle 2nd SIGINT like the default handler would do it:
raise KeyboardInterrupt # python docs say this might show up at an arbitrary place.

def __enter__(self):
self.ctx.__enter__()
Expand Down

0 comments on commit e7f7c39

Please sign in to comment.