mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2026-09-20 22:37:44 +00:00
Use _stop_event consistently across all threads as the way to signal that it should stop. Add thread joins with timeouts to allow the program to exit cleanly
This commit is contained in:
@@ -17,17 +17,16 @@ class APRSIS(SpotProvider):
|
||||
|
||||
def __init__(self, provider_config):
|
||||
super().__init__("APRS-IS", provider_config)
|
||||
self._thread = Thread(target=self._run, name="APRSISSpotProvider")
|
||||
self._thread.daemon = True
|
||||
self._thread = None
|
||||
self._aprsis = None
|
||||
self._running = True
|
||||
self._stop_event = Event()
|
||||
|
||||
def start(self):
|
||||
self._thread = Thread(target=self._run, name="APRSISSpotProvider", daemon=True)
|
||||
self._thread.start()
|
||||
|
||||
def _run(self):
|
||||
while self._running:
|
||||
while not self._stop_event.is_set():
|
||||
try:
|
||||
self._aprsis = aprslib.IS(SERVER_OWNER_CALLSIGN)
|
||||
self.status = "Connecting"
|
||||
@@ -37,20 +36,22 @@ class APRSIS(SpotProvider):
|
||||
self._aprsis.consumer(self._handle, immortal=True)
|
||||
|
||||
except Exception:
|
||||
if self._running:
|
||||
if not self._stop_event.is_set():
|
||||
self.status = "Error"
|
||||
logger.exception("Exception in APRS-IS provider")
|
||||
|
||||
if self._running:
|
||||
if not self._stop_event.is_set():
|
||||
self._stop_event.wait(timeout=5)
|
||||
|
||||
def stop(self):
|
||||
self._running = False
|
||||
self.status = "Shutting down"
|
||||
self._stop_event.set()
|
||||
if self._aprsis:
|
||||
self._aprsis.close()
|
||||
self._thread.join()
|
||||
if self._thread:
|
||||
self._thread.join(timeout=15)
|
||||
if self._thread.is_alive():
|
||||
logger.warning("APRS-IS worker thread did not exit on time and will be killed.")
|
||||
|
||||
def _handle(self, data):
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user