+ netsvc.quit_signals_received += 1
+ if netsvc.quit_signals_received > 1:
+ sys.stderr.write("Forced shutdown.\n")
+ os._exit(0)
+
+def dumpstacks(signum, frame):
+ # code from http://stackoverflow.com/questions/132058/getting-stack-trace-from-a-running-python-application#answer-2569696
+ # modified for python 2.5 compatibility
+ thread_map = dict(threading._active, **threading._limbo)
+ id2name = dict([(threadId, thread.getName()) for threadId, thread in thread_map.items()])
+ code = []
+ for threadId, stack in sys._current_frames().items():
+ code.append("\n# Thread: %s(%d)" % (id2name[threadId], threadId))
+ for filename, lineno, name, line in traceback.extract_stack(stack):
+ code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
+ if line:
+ code.append(" %s" % (line.strip()))
+ logging.getLogger('dumpstacks').info("\n".join(code))
+
+for signum in SIGNALS:
+ signal.signal(signum, handler)
+
+if os.name == 'posix':
+ signal.signal(signal.SIGQUIT, dumpstacks)
+
+def quit():