task: Restore previous interrupt handler after taskMgr.step()

Related to #1180
This commit is contained in:
rdb 2022-01-02 10:39:01 +01:00
parent 2915c6e670
commit 2aac58b5ab

View File

@ -130,6 +130,8 @@ class TaskManager:
self.destroyed = False self.destroyed = False
self.fKeyboardInterrupt = False self.fKeyboardInterrupt = False
self.interruptCount = 0 self.interruptCount = 0
if signal:
self.__prevHandler = signal.default_int_handler
self._frameProfileQueue = [] self._frameProfileQueue = []
@ -171,7 +173,7 @@ class TaskManager:
print('*** allowing mid-frame keyboard interrupt.') print('*** allowing mid-frame keyboard interrupt.')
# Restore default interrupt handler # Restore default interrupt handler
if signal: if signal:
signal.signal(signal.SIGINT, signal.default_int_handler) signal.signal(signal.SIGINT, self.__prevHandler)
# and invoke it # and invoke it
raise KeyboardInterrupt raise KeyboardInterrupt
@ -487,25 +489,30 @@ class TaskManager:
chains that are in sub-threads or that have frame budgets chains that are in sub-threads or that have frame budgets
might execute their tasks differently. """ might execute their tasks differently. """
startFrameTime = self.globalClock.getRealTime()
# Replace keyboard interrupt handler during task list processing # Replace keyboard interrupt handler during task list processing
# so we catch the keyboard interrupt but don't handle it until # so we catch the keyboard interrupt but don't handle it until
# after task list processing is complete. # after task list processing is complete.
self.fKeyboardInterrupt = 0 self.fKeyboardInterrupt = 0
self.interruptCount = 0 self.interruptCount = 0
if signal: 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 finally:
nextTaskTime = self.mgr.getNextWakeTime() # Restore previous interrupt handler
self.doYield(startFrameTime, nextTaskTime) 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: if self.fKeyboardInterrupt:
raise KeyboardInterrupt raise KeyboardInterrupt