in csrc/liars_dice/rela/prioritized_replay.h [59:96]
void blockAppend(const std::vector<DataType>& block,
const torch::Tensor& weights) {
int blockSize = block.size();
std::unique_lock<std::mutex> lk(m_);
cvSize_.wait(lk,
[=] { return size_ + blockSize <= capacity && allow_write_; });
int start = tail_;
int end = (tail_ + blockSize) % capacity;
tail_ = end;
size_ += blockSize;
checkSize(head_, tail_, size_);
lk.unlock();
float sum = 0;
auto weightAcc = weights.accessor<float, 1>();
assert(weightAcc.size(0) == blockSize);
for (int i = 0; i < blockSize; ++i) {
int j = (start + i) % capacity;
elements_[j] = block[i];
weights_[j] = weightAcc[i];
sum += weightAcc[i];
}
lk.lock();
cvTail_.wait(lk, [=] { return safeTail_ == start; });
safeTail_ = end;
safeSize_ += blockSize;
sum_ += sum;
checkSize(head_, safeTail_, safeSize_);
lk.unlock();
cvTail_.notify_all();
}