From 646f12f6258ca512fbed2a8593854a8bcec981bf Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 16 Feb 2012 00:19:09 +0000 Subject: [PATCH] squelch backtrace on SystemExit --- direct/src/task/Task.py | 3 +++ dtool/src/pystub/pystub.cxx | 2 ++ panda/src/event/pythonTask.cxx | 13 +++++++++++-- panda/src/pipeline/thread.cxx | 30 ++++++++++++++++++------------ 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/direct/src/task/Task.py b/direct/src/task/Task.py index 83d9cdfbee..281c634b80 100644 --- a/direct/src/task/Task.py +++ b/direct/src/task/Task.py @@ -502,6 +502,9 @@ class TaskManager: self.step() except KeyboardInterrupt: self.stop() + except SystemExit: + self.stop() + raise except IOError, ioError: code, message = self._unpackIOError(ioError) # Since upgrading to Python 2.4.1, pausing the execution diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index b64a101331..7c690f79e6 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -147,6 +147,7 @@ extern "C" { EXPCL_DTOOLCONFIG extern void *PyExc_RuntimeError; EXPCL_DTOOLCONFIG extern void *PyExc_StandardError; EXPCL_DTOOLCONFIG extern void *PyExc_StopIteration; + EXPCL_DTOOLCONFIG extern void *PyExc_SystemExit; EXPCL_DTOOLCONFIG extern void *PyExc_TypeError; EXPCL_DTOOLCONFIG extern void *PyExc_ValueError; EXPCL_DTOOLCONFIG extern void *_Py_NoneStruct; @@ -290,6 +291,7 @@ void *PyExc_IndexError = (void *)NULL; void *PyExc_RuntimeError = (void *)NULL; void *PyExc_StandardError = (void *)NULL; void *PyExc_StopIteration = (void *)NULL; +void *PyExc_SystemExit = (void *)NULL; void *PyExc_TypeError = (void *)NULL; void *PyExc_ValueError = (void *)NULL; void *_Py_NoneStruct = (void *)NULL; diff --git a/panda/src/event/pythonTask.cxx b/panda/src/event/pythonTask.cxx index a8f888289f..548de2d841 100644 --- a/panda/src/event/pythonTask.cxx +++ b/panda/src/event/pythonTask.cxx @@ -420,8 +420,17 @@ do_python_task() { } if (result == (PyObject *)NULL) { - task_cat.error() - << "Exception occurred in " << *this << "\n"; + if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { + // Don't print an error message for SystemExit. Or rather, make + // it a debug message. + if (task_cat.is_debug()) { + task_cat.debug() + << "SystemExit occurred in " << *this << "\n"; + } + } else { + task_cat.error() + << "Exception occurred in " << *this << "\n"; + } return DS_interrupt; } diff --git a/panda/src/pipeline/thread.cxx b/panda/src/pipeline/thread.cxx index a845a4f315..b33f083890 100644 --- a/panda/src/pipeline/thread.cxx +++ b/panda/src/pipeline/thread.cxx @@ -309,18 +309,24 @@ call_python_func(PyObject *function, PyObject *args) { result = PyObject_Call(function, args, NULL); if (result == (PyObject *)NULL) { - // Temporarily save and restore the exception state so we can print a - // callback on-the-spot. - PyObject *exc, *val, *tb; - PyErr_Fetch(&exc, &val, &tb); - - Py_XINCREF(exc); - Py_XINCREF(val); - Py_XINCREF(tb); - PyErr_Restore(exc, val, tb); - PyErr_Print(); - - PyErr_Restore(exc, val, tb); + if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { + // If we caught SystemExit, let it pass by without bothering + // to print a callback. + + } else { + // Temporarily save and restore the exception state so we can + // print a callback on-the-spot. + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + + Py_XINCREF(exc); + Py_XINCREF(val); + Py_XINCREF(tb); + PyErr_Restore(exc, val, tb); + PyErr_Print(); + + PyErr_Restore(exc, val, tb); + } } } else {