Skip to content
Snippets Groups Projects
Commit 56f6ceba authored by Damien George's avatar Damien George
Browse files

tools/pyboard.py: Don't accumulate output data if data_consumer used.

Prior to this patch, when a lot of data was output by a running script
pyboard.py would try to capture all of this output into the "data"
variable, which would gradually slow down pyboard.py to the point where it
would have large CPU and memory usage (on the host) and potentially lose
data.

This patch fixes this problem by not accumulating the data in the case that
the data is not needed, which is when "data_consumer" is used.
parent aa7b32c8
No related branches found
No related tags found
No related merge requests found
...@@ -261,6 +261,9 @@ class Pyboard: ...@@ -261,6 +261,9 @@ class Pyboard:
self.serial.close() self.serial.close()
def read_until(self, min_num_bytes, ending, timeout=10, data_consumer=None): def read_until(self, min_num_bytes, ending, timeout=10, data_consumer=None):
# if data_consumer is used then data is not accumulated and the ending must be 1 byte long
assert data_consumer is None or len(ending) == 1
data = self.serial.read(min_num_bytes) data = self.serial.read(min_num_bytes)
if data_consumer: if data_consumer:
data_consumer(data) data_consumer(data)
...@@ -270,9 +273,11 @@ class Pyboard: ...@@ -270,9 +273,11 @@ class Pyboard:
break break
elif self.serial.inWaiting() > 0: elif self.serial.inWaiting() > 0:
new_data = self.serial.read(1) new_data = self.serial.read(1)
data = data + new_data
if data_consumer: if data_consumer:
data_consumer(new_data) data_consumer(new_data)
data = new_data
else:
data = data + new_data
timeout_count = 0 timeout_count = 0
else: else:
timeout_count += 1 timeout_count += 1
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment