in src/mwcas/mwcas.cc [906:947]
void Descriptor::DeallocateMemory() {
// Free the memory associated with the descriptor if needed
for(uint32_t i = 0; i < count_; ++i) {
auto& word = words_[i];
auto status = status_;
switch(word.recycle_policy_) {
case kRecycleNever:
case kRecycleOnRecovery:
break;
case kRecycleAlways:
if(status == kStatusSucceeded) {
if(word.old_value_ != kNewValueReserved) {
free_callback_(nullptr, (void*)word.old_value_);
}
} else {
RAW_CHECK(status == kStatusFailed || status == kStatusFinished,
"incorrect status found on used/discarded descriptor");
if(word.new_value_ != kNewValueReserved) {
free_callback_(nullptr, (void*)word.new_value_);
}
}
break;
case kRecycleOldOnSuccess:
if(status == kStatusSucceeded) {
if(word.old_value_ != kNewValueReserved) {
free_callback_(nullptr, (void*)word.old_value_);
}
}
break;
case kRecycleNewOnFailure:
if(status != kStatusSucceeded) {
if(word.new_value_ != kNewValueReserved) {
free_callback_(nullptr, (void*)word.new_value_);
}
}
break;
default:
LOG(FATAL) << "invalid recycle policy";
}
}
count_ = 0;
}