// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once #include "generation_hold_list.h" #include namespace vespalib { template void GenerationHoldList::assign_generation_internal(generation_t current_gen) { for (auto& elem : _phase_1_list) { _phase_2_list.push_back(ElemWithGen(std::move(elem), current_gen)); } _phase_1_list.clear(); } template void GenerationHoldList::reclaim_internal(generation_t oldest_used_gen) { auto itr = _phase_2_list.begin(); auto ite = _phase_2_list.end(); for (; itr != ite; ++itr) { if (itr->gen >= oldest_used_gen) { break; } if (track_bytes_held) { _held_bytes.store(get_held_bytes() - itr->byte_size(), std::memory_order_relaxed); } } if (itr != _phase_2_list.begin()) { _phase_2_list.erase(_phase_2_list.begin(), itr); } } template GenerationHoldList::GenerationHoldList() : _phase_1_list(), _phase_2_list(), _held_bytes() { } template GenerationHoldList::~GenerationHoldList() { assert(_phase_1_list.empty()); assert(_phase_2_list.empty()); assert(get_held_bytes() == 0); } template void GenerationHoldList::insert(T data) { _phase_1_list.push_back(std::move(data)); if (track_bytes_held) { _held_bytes.store(get_held_bytes() + _phase_1_list.back()->byte_size(), std::memory_order_relaxed); } } template void GenerationHoldList::reclaim_all() { _phase_1_list.clear(); _phase_2_list.clear(); _held_bytes = 0; } }