// itemSize bytes. Returns the number of items in the buffer (up to a
// maximum of nItems). If wait is false, then instead of blocking to wait
// for the bytes, zero is returned if the bytes are not immediately
- // available.
+ // available. If itemSize or nItems is zero, check() will return zero.
inline size_t check(size_t itemSize, size_t nItems=1, bool wait=true)
{
size_t nAvail;
+ if (itemSize == 0 || nItems == 0)
+ return 0;
+
if (itemSize > (size_t)(end - ptr))
return overrun(itemSize, nItems, wait);
+ // itemSize cannot be zero at this point
nAvail = (end - ptr) / itemSize;
if (nAvail < nItems)
return nAvail;
// checkNoWait() tries to make sure that the given number of bytes can
// be read without blocking. It returns true if this is the case, false
// otherwise. The length must be "small" (less than the buffer size).
+ // If length is zero, checkNoWait() will return true.
- inline bool checkNoWait(size_t length) { return check(length, 1, false)!=0; }
+ inline bool checkNoWait(size_t length)
+ {
+ return length == 0 || check(length, 1, false) > 0;
+ }
// readU/SN() methods read unsigned and signed N-bit integers.
}
// readBytes() reads an exact number of bytes.
+ // If length is zero, readBytes() will return immediately.
void readBytes(void* data, size_t length) {
while (length > 0) {