in src/afs.cc [275:320]
size_t read(size_t n, void* output)
{
P("%s: %s: before: (%d:%d) %d", Tag, AFS_FUNC, data_->head, data_->tail, n);
size_t readSize = 0;
const auto input = address();
if (data_->head > data_->tail)
{
const auto firstHalfReadSize = std::min(n, data_->total - data_->head);
P("%s: %s: first half: (%d:%d) %d:%d",
Tag,
AFS_FUNC,
data_->head,
data_->tail,
n,
firstHalfReadSize);
memcpy(output, input + data_->head, firstHalfReadSize);
data_->head = (data_->head + firstHalfReadSize) % data_->total;
n -= firstHalfReadSize;
readSize += firstHalfReadSize;
}
if (n > 0 && data_->head != data_->tail)
{
const auto lastHalfReadSize = std::min(n, data_->tail - data_->head);
P("%s: %s: last half: (%d:%d) %d:%d",
Tag,
AFS_FUNC,
data_->head,
data_->tail,
n,
lastHalfReadSize);
memcpy(static_cast<uint8_t*>(output) + readSize,
input + data_->head,
lastHalfReadSize);
data_->head += lastHalfReadSize;
n -= lastHalfReadSize;
readSize += lastHalfReadSize;
}
P("%s: %s: after: (%d:%d) %d:%d",
Tag,
AFS_FUNC,
data_->head,
data_->tail,
n,
readSize);
return readSize;
}