in src/afs.cc [261:339]
size_t write(const void* data, size_t n)
{
#ifdef AFS_VERBOSE
const char* tag = "write";
#endif
P("%s: %s: %s: before: (%" PRIsize ":%" PRIsize ") %" PRIsize,
Tag,
tag_,
tag,
data_->head,
data_->tail,
n);
if (rest_size() == 0)
{
P("%s: %s: %s: after: no space: (%" PRIsize ":%" PRIsize ") %" PRIsize ":0",
Tag,
tag_,
tag,
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: %s: first half: (%" PRIsize ":%" PRIsize ") %" PRIsize
":%" PRIsize,
Tag,
tag_,
tag,
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: %s: last half: (%" PRIsize ":%" PRIsize ") %" PRIsize ":%" PRIsize,
Tag,
tag_,
tag,
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: %s: after: (%" PRIsize ":%" PRIsize ") %" PRIsize ":%" PRIsize
" [%s] [%s]",
Tag,
tag_,
tag,
data_->head,
data_->tail,
n,
writtenSize,
arrow::HexEncode(reinterpret_cast<const uint8_t*>(data), writtenSize).c_str(),
arrow::HexEncode(reinterpret_cast<uint8_t*>(output), writtenSize).c_str());
return writtenSize;
}