stream: read huge data in blocks on POSIX

read() blocks when there is no more data to read. However, we do need
to loop when read is divided into blocks.

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2025-06-05 12:27:54 +02:00
parent fc852c77c7
commit f1e894aefd

View File

@ -2260,17 +2260,19 @@ namespace stdex
reinterpret_cast<uint8_t*&>(data) += num_read; reinterpret_cast<uint8_t*&>(data) += num_read;
} }
#else #else
auto num_read = ::read(m_h, data, length); for (size_t to_read = length;;) {
auto num_read = ::read(m_h, data, std::min<size_t>(to_read, SSIZE_MAX));
if (num_read < 0) _Unlikely_ { if (num_read < 0) _Unlikely_ {
m_state = state_t::fail; m_state = to_read < length ? state_t::ok : state_t::fail;
return 0; return length - to_read;
} }
if (!num_read) _Unlikely_ { to_read -= static_cast<size_t>(num_read);
m_state = !length ? state_t::ok : state_t::eof; if (num_read < SSIZE_MAX) {
return 0; m_state = to_read < length || !length ? state_t::ok : state_t::eof;
return length - to_read;
}
reinterpret_cast<uint8_t*&>(data) += num_read;
} }
m_state = state_t::ok;
return num_read;
#endif #endif
} }