mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-18 09:43:34 +08:00
protocol_splitter: check available bytes before read()
This is to avoid blocking in any case. If we don't do that, ioctl() may signal data available while the other protocol does a read(), and when the first protocol tries to do a read(), it would not have data anymore and would block (so this avoids a race condition).
This commit is contained in:
@@ -160,9 +160,15 @@ int ReadBuffer::read(int fd)
|
||||
PX4_DEBUG("Buffer full: %zu %zu %zu %zu", start_mavlink, end_mavlink, start_rtps, end_rtps);
|
||||
}
|
||||
|
||||
int r = ::read(fd, buffer + buf_size, sizeof(buffer) - buf_size);
|
||||
int bytes_available = 0;
|
||||
int err = ::ioctl(fd, FIONREAD, (unsigned long)&bytes_available);
|
||||
ssize_t r = 0;
|
||||
|
||||
if (r < 0) {
|
||||
if (err != 0 || bytes_available > 0) {
|
||||
r = ::read(fd, buffer + buf_size, sizeof(buffer) - buf_size);
|
||||
}
|
||||
|
||||
if (r <= 0) {
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user