aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2022-02-21 22:12:53 -0500
committerKevin O'Connor <kevin@koconnor.net>2022-02-21 22:22:14 -0500
commitb0a24a4458beca81e4a97a9cf505ca9d42251e8a (patch)
treef075122ec99a8a58b529497b51ced124d42d7679
parent2b2caa8f050d32efe1659e8d7c7431d07e9e67a0 (diff)
downloadkutter-b0a24a4458beca81e4a97a9cf505ca9d42251e8a.tar.gz
kutter-b0a24a4458beca81e4a97a9cf505ca9d42251e8a.tar.xz
kutter-b0a24a4458beca81e4a97a9cf505ca9d42251e8a.zip
motion_report: Ensure startstop_cb is called atomically
Make sure APIDumpHelper() does not invoke the startstop callback while it is already running. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--klippy/extras/motion_report.py16
1 files changed, 12 insertions, 4 deletions
diff --git a/klippy/extras/motion_report.py b/klippy/extras/motion_report.py
index 34fc455d..d32de43f 100644
--- a/klippy/extras/motion_report.py
+++ b/klippy/extras/motion_report.py
@@ -17,29 +17,37 @@ class APIDumpHelper:
if startstop_cb is None:
startstop_cb = (lambda is_start: None)
self.startstop_cb = startstop_cb
+ self.is_started = False
self.update_interval = update_interval
self.update_timer = None
self.clients = {}
def _stop(self):
self.clients.clear()
- if self.update_timer is None:
- return
reactor = self.printer.get_reactor()
reactor.unregister_timer(self.update_timer)
self.update_timer = None
+ if not self.is_started:
+ return reactor.NEVER
try:
self.startstop_cb(False)
except self.printer.command_error as e:
logging.exception("API Dump Helper stop callback error")
+ self.clients.clear()
+ self.is_started = False
+ if self.clients:
+ # New client started while in process of stopping
+ self._start()
return reactor.NEVER
def _start(self):
- if self.update_timer is not None:
+ if self.is_started:
return
+ self.is_started = True
try:
self.startstop_cb(True)
except self.printer.command_error as e:
logging.exception("API Dump Helper start callback error")
- self._stop()
+ self.is_started = False
+ self.clients.clear()
raise
reactor = self.printer.get_reactor()
systime = reactor.monotonic()