diff options
-rwxr-xr-x | mpm/python/usrp_hwd.py | 3 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/rpc_server.py | 15 |
2 files changed, 13 insertions, 5 deletions
diff --git a/mpm/python/usrp_hwd.py b/mpm/python/usrp_hwd.py index f79932231..3523fa9b4 100755 --- a/mpm/python/usrp_hwd.py +++ b/mpm/python/usrp_hwd.py @@ -102,10 +102,7 @@ def kill_time(sig, frame): proc.terminate() log.info("Terminating pid: {0}".format(proc.pid)) for proc in _PROCESSES: - try: proc.join() - except BlockingSwitchOutError: - log.debug("Caught BlockingSwitchOutError for {}".format(str(proc))) log.info("System exiting") sys.exit(0) diff --git a/mpm/python/usrp_mpm/rpc_server.py b/mpm/python/usrp_mpm/rpc_server.py index 8b87c52d8..65428f116 100644 --- a/mpm/python/usrp_mpm/rpc_server.py +++ b/mpm/python/usrp_mpm/rpc_server.py @@ -13,6 +13,8 @@ import copy from random import choice from string import ascii_letters, digits from multiprocessing import Process +import threading +import sys from gevent.server import StreamServer from gevent.pool import Pool from gevent import signal @@ -555,8 +557,17 @@ def _rpc_server_process(shared_state, port, default_args): handle=MPMServer(shared_state, default_args), spawn=connections) # catch signals and stop the stream server - signal(signal.SIGTERM, lambda *args: server.stop()) - signal(signal.SIGINT, lambda *args: server.stop()) + # Previously, the signal callbacks simply called server.stop() + # gevent doesn't like this because server.stop() may block waiting + # for greenlets to stop, and signal callbacks are not supposed to block + stop_event = threading.Event() + def stop_worker(): + stop_event.wait() + server.stop() + sys.exit(0) + threading.Thread(target=stop_worker, daemon=True).start() + signal(signal.SIGTERM, lambda *args: stop_event.set()) + signal(signal.SIGINT, lambda *args: stop_event.set()) server.serve_forever() |