From 5ebe8ce0259443b4f5924ed019b305627f73bc7c Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Wed, 30 Nov 2016 19:05:25 -0500 Subject: [PATCH] gcode: Don't dump the message log directly from set_printer_ready() The set_printer_ready() method can be called from a background thread. Have the main Printer class call a new dump_debug() method in the main thread on a shutdown event. Signed-off-by: Kevin O'Connor --- klippy/gcode.py | 11 +++++------ klippy/klippy.py | 7 +++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/klippy/gcode.py b/klippy/gcode.py index ff7e2443..d607a0cc 100644 --- a/klippy/gcode.py +++ b/klippy/gcode.py @@ -72,12 +72,11 @@ class GCodeParser: self.build_handlers() if is_ready and self.is_fileinput and self.fd_handle is None: self.fd_handle = self.reactor.register_fd(self.fd, self.process_data) - if not is_ready: - logging.info("Dumping gcode input %d blocks" % ( - len(self.input_log),)) - # XXX - read from self.input_log is not thread safe - for eventtime, data in self.input_log: - logging.info("Read %f: %s" % (eventtime, repr(data))) + def dump_debug(self): + logging.info("Dumping gcode input %d blocks" % ( + len(self.input_log),)) + for eventtime, data in self.input_log: + logging.info("Read %f: %s" % (eventtime, repr(data))) # Parse input into commands args_r = re.compile('([a-zA-Z*])') def process_commands(self, eventtime): diff --git a/klippy/klippy.py b/klippy/klippy.py index 9b7a68ab..0dbc8f60 100644 --- a/klippy/klippy.py +++ b/klippy/klippy.py @@ -82,6 +82,7 @@ class Printer: self.connect_timer = self.reactor.register_timer( self.connect, self.reactor.NOW) self.all_config_options = {} + self.need_dump_debug = False self.state_message = message_startup self.debugoutput = self.dictionary = None self.fileconfig = None @@ -91,6 +92,10 @@ class Printer: self.debugoutput = debugoutput self.dictionary = dictionary def stats(self, eventtime): + if self.need_dump_debug: + # Call dump_debug here so it is executed in the main thread + self.gcode.dump_debug() + self.need_dump_debug = False out = [] out.append(self.gcode.stats(eventtime)) toolhead = self.objects.get('toolhead') @@ -174,6 +179,8 @@ class Printer: def get_state_message(self): return self.state_message def note_shutdown(self, msg): + if self.state_message == 'Running': + self.need_dump_debug = True self.state_message = "Firmware shutdown: %s%s" % ( msg, message_shutdown) self.gcode.set_printer_ready(False)