in src/afs.cc [212:273]
size_t write(const void* data, size_t n)
{
P("%s: %s: before: (%d:%d) %d", Tag, AFS_FUNC, data_->head, data_->tail, n);
if (rest_size() == 0)
{
P("%s: %s: after: no space: (%d:%d) %d:0",
Tag,
AFS_FUNC,
data_->head,
data_->tail,
n);
return 0;
}
size_t writtenSize = 0;
auto output = address();
if (data_->head <= data_->tail)
{
auto restSize = data_->total - data_->tail;
if (data_->head == 0)
{
restSize--;
}
const auto firstHalfWriteSize = std::min(n, restSize);
P("%s: %s: first half: (%d:%d) %d:%d",
Tag,
AFS_FUNC,
data_->head,
data_->tail,
n,
firstHalfWriteSize);
memcpy(output + data_->tail, data, firstHalfWriteSize);
data_->tail = (data_->tail + firstHalfWriteSize) % data_->total;
n -= firstHalfWriteSize;
writtenSize += firstHalfWriteSize;
}
if (n > 0 && rest_size() > 0)
{
const auto lastHalfWriteSize = std::min(n, data_->head - data_->tail - 1);
P("%s: %s: last half: (%d:%d) %d:%d",
Tag,
AFS_FUNC,
data_->head,
data_->tail,
n,
lastHalfWriteSize);
memcpy(output + data_->tail,
static_cast<const uint8_t*>(data) + writtenSize,
lastHalfWriteSize);
data_->tail += lastHalfWriteSize;
n -= lastHalfWriteSize;
writtenSize += lastHalfWriteSize;
}
P("%s: %s: after: (%d:%d) %d:%d",
Tag,
AFS_FUNC,
data_->head,
data_->tail,
n,
writtenSize);
return writtenSize;
}