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.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