void Descriptor::DeallocateMemory()

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;
}