From 9661d770cb6aa33525583854d66193c81510cfbc Mon Sep 17 00:00:00 2001
From: Athanasius <github@miggy.org>
Date: Mon, 16 Aug 2021 14:20:32 +0100
Subject: [PATCH] companion: Implement, and use, asking CAPI thread to close
 down

---
 EDMarketConnector.py |  4 ++++
 companion.py         | 13 +++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/EDMarketConnector.py b/EDMarketConnector.py
index d1dee989..0e6cc95c 100755
--- a/EDMarketConnector.py
+++ b/EDMarketConnector.py
@@ -1577,6 +1577,10 @@ class AppWindow(object):
         logger.info('Unregistering hotkey manager...')
         hotkeymgr.unregister()
 
+        # Now the CAPI query thread
+        logger.info('Closing CAPI query thread...')
+        companion.session.capi_query_close_worker()
+
         # Now the main programmatic input methods
         logger.info('Closing dashboard...')
         dashboard.close()
diff --git a/companion.py b/companion.py
index 69b6e63d..970f3e64 100644
--- a/companion.py
+++ b/companion.py
@@ -21,6 +21,7 @@ import webbrowser
 from builtins import object, range, str
 from email.utils import parsedate
 from os.path import join
+from queue import Queue
 from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional, OrderedDict, TypeVar, Union
 
 import requests
@@ -478,6 +479,7 @@ class Session(object):
         self.retrying = False  # Avoid infinite loop when successful auth / unsuccessful query
 
         logger.info('Starting CAPI queries thread...')
+        self.capi_query_queue: Queue = Queue()
         self.capi_query_thread = threading.Thread(
             target=self.capi_query_worker,
             daemon=True,
@@ -596,11 +598,22 @@ class Session(object):
     def capi_query_worker(self, ):
         """Worker thread that performs actual CAPI queries."""
         logger.info('CAPI worker thread starting')
+
         while True:
+            query: Optional[str] = self.capi_query_queue.get()
+            if not query:
+                logger.info('Empty queue message, exiting...')
+                break
+
+            logger.trace_if('capi.worker', f'Processing query: {query}')
             time.sleep(1)
 
         logger.info('CAPI worker thread DONE')
 
+    def capi_query_close_worker(self) -> None:
+        """Ask the CAPI query thread to finish."""
+        self.capi_query_queue.put(None)
+
     def query(self, endpoint: str) -> CAPIData:  # noqa: CCR001, C901
         """Perform a query against the specified CAPI endpoint."""
         logger.trace_if('capi.query', f'Performing query for endpoint "{endpoint}"')