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.
This commit is contained in:
parent
aa7b32c811
commit
56f6ceba7f
@ -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:
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user