1
0
mirror of https://github.com/JoelBender/bacpypes synced 2025-09-28 22:15:23 +08:00

add sigterm and sigusr1 parameters to run, move the stop() and print_stack() functions up, remove code attaching signal handlers at import time

This commit is contained in:
Joel Bender 2017-03-21 10:01:13 -04:00
parent 665ee4be99
commit d7d096ec47
3 changed files with 143 additions and 146 deletions

View File

@ -29,10 +29,16 @@ sleeptime = 0.0
SPIN = 1.0
def run(spin=SPIN):
if _debug: run._debug("run spin=%r", spin)
def run(spin=SPIN, sigterm=stop, sigusr1=print_stack):
if _debug: run._debug("run spin=%r sigterm=%r, sigusr1=%r", spin, sigterm, sigusr1)
global running, taskManager, deferredFns, sleeptime
# install the signal handlers if they have been provided (issue #112)
if (sigterm is not None) and hasattr(signal, 'SIGTERM'):
signal.signal(signal.SIGTERM, sigterm)
if (sigusr1 is not None) and hasattr(signal, 'SIGUSR1'):
signal.signal(signal.SIGUSR1, sigusr1)
# reference the task manager (a singleton)
taskManager = TaskManager()
@ -165,10 +171,6 @@ def stop(*args):
bacpypes_debugging(stop)
# set a TERM signal handler
if hasattr(signal, 'SIGTERM'):
signal.signal(signal.SIGTERM, stop)
#
# print_stack
#
@ -206,10 +208,6 @@ def print_stack(sig, frame):
bacpypes_debugging(print_stack)
# set a USR1 signal handler to print a stack trace
if hasattr(signal, 'SIGUSR1'):
signal.signal(signal.SIGUSR1, print_stack)
#
# deferred
#
@ -242,3 +240,4 @@ def enable_sleeping(stime=0.001):
sleeptime = stime
bacpypes_debugging(enable_sleeping)

View File

@ -23,6 +23,64 @@ taskManager = None
deferredFns = []
sleeptime = 0.0
#
# stop
#
@bacpypes_debugging
def stop(*args):
"""Call to stop running, may be called with a signum and frame
parameter if called as a signal handler."""
if _debug: stop._debug("stop")
global running, taskManager
if args:
sys.stderr.write("===== TERM Signal, %s\n" % time.strftime("%d-%b-%Y %H:%M:%S"))
sys.stderr.flush()
running = False
# trigger the task manager event
if taskManager and taskManager.trigger:
if _debug: stop._debug(" - trigger")
taskManager.trigger.set()
#
# print_stack
#
@bacpypes_debugging
def print_stack(sig, frame):
"""Signal handler to print a stack trace and some interesting values."""
if _debug: print_stack._debug("print_stack, %r, %r", sig, frame)
global running, deferredFns, sleeptime
sys.stderr.write("==== USR1 Signal, %s\n" % time.strftime("%d-%b-%Y %H:%M:%S"))
sys.stderr.write("---------- globals\n")
sys.stderr.write(" running: %r\n" % (running,))
sys.stderr.write(" deferredFns: %r\n" % (deferredFns,))
sys.stderr.write(" sleeptime: %r\n" % (sleeptime,))
sys.stderr.write("---------- stack\n")
traceback.print_stack(frame)
# make a list of interesting frames
flist = []
f = frame
while f.f_back:
flist.append(f)
f = f.f_back
# reverse the list so it is in the same order as print_stack
flist.reverse()
for f in flist:
sys.stderr.write("---------- frame: %s\n" % (f,))
for k, v in f.f_locals.items():
sys.stderr.write(" %s: %r\n" % (k, v))
sys.stderr.flush()
#
# run
#
@ -30,10 +88,16 @@ sleeptime = 0.0
SPIN = 1.0
@bacpypes_debugging
def run(spin=SPIN):
if _debug: run._debug("run spin=%r", spin)
def run(spin=SPIN, sigterm=stop, sigusr1=print_stack):
if _debug: run._debug("run spin=%r sigterm=%r, sigusr1=%r", spin, sigterm, sigusr1)
global running, taskManager, deferredFns, sleeptime
# install the signal handlers if they have been provided (issue #112)
if (sigterm is not None) and hasattr(signal, 'SIGTERM'):
signal.signal(signal.SIGTERM, sigterm)
if (sigusr1 is not None) and hasattr(signal, 'SIGUSR1'):
signal.signal(signal.SIGUSR1, sigusr1)
# reference the task manager (a singleton)
taskManager = TaskManager()
@ -140,72 +204,6 @@ def run_once():
except Exception as err:
if _debug: run_once._exception("an error has occurred: %s", err)
#
# stop
#
@bacpypes_debugging
def stop(*args):
"""Call to stop running, may be called with a signum and frame
parameter if called as a signal handler."""
if _debug: stop._debug("stop")
global running, taskManager
if args:
sys.stderr.write("===== TERM Signal, %s\n" % time.strftime("%d-%b-%Y %H:%M:%S"))
sys.stderr.flush()
running = False
# trigger the task manager event
if taskManager and taskManager.trigger:
if _debug: stop._debug(" - trigger")
taskManager.trigger.set()
# set a TERM signal handler
if hasattr(signal, 'SIGTERM'):
signal.signal(signal.SIGTERM, stop)
#
# print_stack
#
@bacpypes_debugging
def print_stack(sig, frame):
"""Signal handler to print a stack trace and some interesting values."""
if _debug: print_stack._debug("print_stack, %r, %r", sig, frame)
global running, deferredFns, sleeptime
sys.stderr.write("==== USR1 Signal, %s\n" % time.strftime("%d-%b-%Y %H:%M:%S"))
sys.stderr.write("---------- globals\n")
sys.stderr.write(" running: %r\n" % (running,))
sys.stderr.write(" deferredFns: %r\n" % (deferredFns,))
sys.stderr.write(" sleeptime: %r\n" % (sleeptime,))
sys.stderr.write("---------- stack\n")
traceback.print_stack(frame)
# make a list of interesting frames
flist = []
f = frame
while f.f_back:
flist.append(f)
f = f.f_back
# reverse the list so it is in the same order as print_stack
flist.reverse()
for f in flist:
sys.stderr.write("---------- frame: %s\n" % (f,))
for k, v in f.f_locals.items():
sys.stderr.write(" %s: %r\n" % (k, v))
sys.stderr.flush()
# set a USR1 signal handler to print a stack trace
if hasattr(signal, 'SIGUSR1'):
signal.signal(signal.SIGUSR1, print_stack)
#
# deferred
#
@ -237,3 +235,4 @@ def enable_sleeping(stime=0.001):
# set the sleep time
sleeptime = stime

View File

@ -23,6 +23,64 @@ taskManager = None
deferredFns = []
sleeptime = 0.0
#
# stop
#
@bacpypes_debugging
def stop(*args):
"""Call to stop running, may be called with a signum and frame
parameter if called as a signal handler."""
if _debug: stop._debug("stop")
global running, taskManager
if args:
sys.stderr.write("===== TERM Signal, %s\n" % time.strftime("%d-%b-%Y %H:%M:%S"))
sys.stderr.flush()
running = False
# trigger the task manager event
if taskManager and taskManager.trigger:
if _debug: stop._debug(" - trigger")
taskManager.trigger.set()
#
# print_stack
#
@bacpypes_debugging
def print_stack(sig, frame):
"""Signal handler to print a stack trace and some interesting values."""
if _debug: print_stack._debug("print_stack, %r, %r", sig, frame)
global running, deferredFns, sleeptime
sys.stderr.write("==== USR1 Signal, %s\n" % time.strftime("%d-%b-%Y %H:%M:%S"))
sys.stderr.write("---------- globals\n")
sys.stderr.write(" running: %r\n" % (running,))
sys.stderr.write(" deferredFns: %r\n" % (deferredFns,))
sys.stderr.write(" sleeptime: %r\n" % (sleeptime,))
sys.stderr.write("---------- stack\n")
traceback.print_stack(frame)
# make a list of interesting frames
flist = []
f = frame
while f.f_back:
flist.append(f)
f = f.f_back
# reverse the list so it is in the same order as print_stack
flist.reverse()
for f in flist:
sys.stderr.write("---------- frame: %s\n" % (f,))
for k, v in f.f_locals.items():
sys.stderr.write(" %s: %r\n" % (k, v))
sys.stderr.flush()
#
# run
#
@ -30,10 +88,16 @@ sleeptime = 0.0
SPIN = 1.0
@bacpypes_debugging
def run(spin=SPIN):
if _debug: run._debug("run spin=%r", spin)
def run(spin=SPIN, sigterm=stop, sigusr1=print_stack):
if _debug: run._debug("run spin=%r sigterm=%r, sigusr1=%r", spin, sigterm, sigusr1)
global running, taskManager, deferredFns, sleeptime
# install the signal handlers if they have been provided (issue #112)
if (sigterm is not None) and hasattr(signal, 'SIGTERM'):
signal.signal(signal.SIGTERM, sigterm)
if (sigusr1 is not None) and hasattr(signal, 'SIGUSR1'):
signal.signal(signal.SIGUSR1, sigusr1)
# reference the task manager (a singleton)
taskManager = TaskManager()
@ -140,72 +204,6 @@ def run_once():
except Exception as err:
if _debug: run_once._exception("an error has occurred: %s", err)
#
# stop
#
@bacpypes_debugging
def stop(*args):
"""Call to stop running, may be called with a signum and frame
parameter if called as a signal handler."""
if _debug: stop._debug("stop")
global running, taskManager
if args:
sys.stderr.write("===== TERM Signal, %s\n" % time.strftime("%d-%b-%Y %H:%M:%S"))
sys.stderr.flush()
running = False
# trigger the task manager event
if taskManager and taskManager.trigger:
if _debug: stop._debug(" - trigger")
taskManager.trigger.set()
# set a TERM signal handler
if hasattr(signal, 'SIGTERM'):
signal.signal(signal.SIGTERM, stop)
#
# print_stack
#
@bacpypes_debugging
def print_stack(sig, frame):
"""Signal handler to print a stack trace and some interesting values."""
if _debug: print_stack._debug("print_stack, %r, %r", sig, frame)
global running, deferredFns, sleeptime
sys.stderr.write("==== USR1 Signal, %s\n" % time.strftime("%d-%b-%Y %H:%M:%S"))
sys.stderr.write("---------- globals\n")
sys.stderr.write(" running: %r\n" % (running,))
sys.stderr.write(" deferredFns: %r\n" % (deferredFns,))
sys.stderr.write(" sleeptime: %r\n" % (sleeptime,))
sys.stderr.write("---------- stack\n")
traceback.print_stack(frame)
# make a list of interesting frames
flist = []
f = frame
while f.f_back:
flist.append(f)
f = f.f_back
# reverse the list so it is in the same order as print_stack
flist.reverse()
for f in flist:
sys.stderr.write("---------- frame: %s\n" % (f,))
for k, v in f.f_locals.items():
sys.stderr.write(" %s: %r\n" % (k, v))
sys.stderr.flush()
# set a USR1 signal handler to print a stack trace
if hasattr(signal, 'SIGUSR1'):
signal.signal(signal.SIGUSR1, print_stack)
#
# deferred
#
@ -237,3 +235,4 @@ def enable_sleeping(stime=0.001):
# set the sleep time
sleeptime = stime