#include "function/gds/frontier_morsel.h"
using namespace lbug::common;
namespace lbug {
namespace function {
FrontierMorselDispatcher::FrontierMorselDispatcher(uint64_t maxThreads)
: maxOffset{INVALID_OFFSET}, maxThreads{maxThreads}, morselSize(UINT64_MAX) {
nextOffset.store(INVALID_OFFSET);
}
void FrontierMorselDispatcher::init(offset_t _maxOffset) {
maxOffset = _maxOffset;
nextOffset.store(0u);
auto idealMorselSize =
maxOffset / std::max(MIN_NUMBER_OF_FRONTIER_MORSELS, maxThreads * maxThreads);
morselSize = std::max(MIN_FRONTIER_MORSEL_SIZE, idealMorselSize);
}
bool FrontierMorselDispatcher::getNextRangeMorsel(FrontierMorsel& frontierMorsel) {
auto beginOffset = nextOffset.fetch_add(morselSize, std::memory_order_acq_rel);
if (beginOffset >= maxOffset) {
return false;
}
auto endOffset = beginOffset + morselSize > maxOffset ? maxOffset : beginOffset + morselSize;
frontierMorsel.init(beginOffset, endOffset);
return true;
}
} }