diff --git a/direct/src/task/Task.py b/direct/src/task/Task.py index 7be8e077d4..fb1dba7bc6 100644 --- a/direct/src/task/Task.py +++ b/direct/src/task/Task.py @@ -130,6 +130,8 @@ class TaskManager: self.destroyed = False self.fKeyboardInterrupt = False self.interruptCount = 0 + if signal: + self.__prevHandler = signal.default_int_handler self._frameProfileQueue = [] @@ -171,7 +173,7 @@ class TaskManager: print('*** allowing mid-frame keyboard interrupt.') # Restore default interrupt handler if signal: - signal.signal(signal.SIGINT, signal.default_int_handler) + signal.signal(signal.SIGINT, self.__prevHandler) # and invoke it raise KeyboardInterrupt @@ -487,25 +489,30 @@ class TaskManager: chains that are in sub-threads or that have frame budgets might execute their tasks differently. """ + startFrameTime = self.globalClock.getRealTime() + # Replace keyboard interrupt handler during task list processing # so we catch the keyboard interrupt but don't handle it until # after task list processing is complete. self.fKeyboardInterrupt = 0 self.interruptCount = 0 + if signal: - signal.signal(signal.SIGINT, self.keyboardInterruptHandler) + self.__prevHandler = signal.signal(signal.SIGINT, self.keyboardInterruptHandler) - startFrameTime = self.globalClock.getRealTime() + try: + self.mgr.poll() - self.mgr.poll() + # This is the spot for an internal yield function + nextTaskTime = self.mgr.getNextWakeTime() + self.doYield(startFrameTime, nextTaskTime) - # This is the spot for an internal yield function - nextTaskTime = self.mgr.getNextWakeTime() - self.doYield(startFrameTime, nextTaskTime) + finally: + # Restore previous interrupt handler + if signal: + signal.signal(signal.SIGINT, self.__prevHandler) + self.__prevHandler = signal.default_int_handler - # Restore default interrupt handler - if signal: - signal.signal(signal.SIGINT, signal.default_int_handler) if self.fKeyboardInterrupt: raise KeyboardInterrupt