reduced the number of read(2)s
diff --git a/bbb_cape/src/bbb/packet_finder.cc b/bbb_cape/src/bbb/packet_finder.cc
index 15a8e62..783ce32 100644
--- a/bbb_cape/src/bbb/packet_finder.cc
+++ b/bbb_cape/src/bbb/packet_finder.cc
@@ -30,7 +30,7 @@
PacketFinder::PacketFinder(ByteReaderInterface *reader, size_t packet_size)
: reader_(reader),
packet_size_(packet_size),
- buf_(new AlignedChar[packet_size_]),
+ buf_(new AlignedChar[packet_size_ + kZeros]),
unstuffed_data_(new AlignedChar[packet_size_ - 4]) {
CHECK((packet_size_ % 4) == 0);
}
@@ -45,14 +45,15 @@
int zeros_found = 0;
while (true) {
size_t already_read = ::std::max(0, packet_bytes_);
+ size_t to_read = packet_size_ - already_read;
+ if (packet_bytes_ == -1) to_read += kZeros;
ssize_t new_bytes =
reader_->ReadBytes((uint8_t *)(buf_ + already_read),
- packet_size_ - already_read, timeout_time);
+ to_read, timeout_time);
if (new_bytes < 0) {
if (new_bytes == -1) {
LOG(ERROR, "ReadBytes(%p, %zd) failed with %d: %s\n",
- buf_ + already_read, packet_size_ - already_read, errno,
- strerror(errno));
+ buf_ + already_read, to_read, errno, strerror(errno));
} else if (new_bytes == -2) {
LOG(INFO, "timed out\n");
} else {
@@ -86,7 +87,7 @@
++to_check) {
if (buf_[to_check] == 0) {
++zeros_found;
- if (zeros_found == 4) {
+ if (zeros_found == kZeros) {
packet_bytes_ = 0;
zeros_found = 0;
new_bytes -= to_check + 1;
@@ -101,6 +102,7 @@
}
if (packet_bytes_ != -1) { // if we decided that these are good bytes
packet_bytes_ += new_bytes;
+ CHECK_LE(packet_bytes_, static_cast<ssize_t>(packet_size_));
if (packet_bytes_ == static_cast<ssize_t>(packet_size_)) return true;
}
}
@@ -149,7 +151,7 @@
for (size_t i = 0; i < packet_size_; ++i) {
if (buf_[i] == 0) {
++zeros;
- if (zeros == 4) {
+ if (zeros == kZeros) {
if (kDebugLogs) LOG(INFO, "start at %zd\n", i);
packet_bytes_ = packet_size_ - (i + 1);
memmove(buf_, buf_ + i + 1, packet_bytes_);
diff --git a/bbb_cape/src/bbb/packet_finder.h b/bbb_cape/src/bbb/packet_finder.h
index 962291f..2ad230b 100644
--- a/bbb_cape/src/bbb/packet_finder.h
+++ b/bbb_cape/src/bbb/packet_finder.h
@@ -41,6 +41,8 @@
// We have 64-bit ints in some of our data.
typedef char __attribute__((aligned(8))) AlignedChar;
+ static const int kZeros = 4;
+
// Reads bytes until there are 4 zeros and then fills up buf_.
// Returns true if it finds one or false if it gets an I/O error first or the
// packet is invalid in some way.
diff --git a/bbb_cape/src/bbb/packet_finder_test.cc b/bbb_cape/src/bbb/packet_finder_test.cc
index ccd81e5..3e6dc26 100644
--- a/bbb_cape/src/bbb/packet_finder_test.cc
+++ b/bbb_cape/src/bbb/packet_finder_test.cc
@@ -24,10 +24,10 @@
const ::aos::time::Time &/*timeout_time*/)
override {
size_t to_transfer = ::std::min(max_bytes, bytes_left_);
+ if (to_transfer == 0) return -2;
memcpy(dest, static_cast<const uint8_t *>(data_) + data_size_ - bytes_left_,
to_transfer);
bytes_left_ -= to_transfer;
- if (to_transfer == 0) return -2;
return to_transfer;
}
@@ -60,7 +60,12 @@
EXPECT_EQ(!expect_failure,
packet_finder.ReadPacket(::aos::time::Time(0, 0)));
if (expect_failure && i + 1 != *failure && i + 1 != packets) {
- while (!packet_finder.ReadPacket(::aos::time::Time(0, 0))) {}
+ int failures = 0;
+ while (!packet_finder.ReadPacket(::aos::time::Time(0, 0))) {
+ ++failures;
+ SCOPED_TRACE("failure " + ::std::to_string(failures));
+ ASSERT_LT(failures, 500);
+ }
i += 1;
}
}