TURF_TRACE_DECLARE(ConcurrentMap_Grampa, 27)
-template <typename K, typename V, class KT = DefaultKeyTraits<K>, class VT = DefaultValueTraits<V>>
+template <typename K, typename V, class KT = DefaultKeyTraits<K>, class VT = DefaultValueTraits<V> >
class ConcurrentMap_Grampa {
public:
typedef K Key;
if (root & 1) {
typename Details::FlatTree* flatTree = (typename Details::FlatTree*) (root & ~ureg(1));
for (;;) {
- ureg leafIdx = (hash >> flatTree->safeShift);
+ ureg leafIdx = ureg(hash >> flatTree->safeShift);
table = flatTree->getTables()[leafIdx].load(turf::Relaxed);
if (ureg(table) != Details::RedirectFlatTree) {
sizeMask = (Details::LeafSize - 1);
// Retry the loop.
} else {
ureg repeat = ureg(1) << (migration->m_safeShift - flatTree->safeShift);
- ureg dstStartIndex = migration->m_baseHash >> flatTree->safeShift;
+ ureg dstStartIndex = ureg(migration->m_baseHash >> flatTree->safeShift);
// The subtree we're about to publish fits inside the flattree.
TURF_ASSERT(dstStartIndex + migration->m_numDestinations * repeat - 1 <= Hash(-1) >> flatTree->safeShift);
// If a previous attempt to publish got redirected, resume publishing into the new flattree,
Value exchangeValue(Value desired) {
TURF_ASSERT(desired != Value(ValueTraits::NullValue));
+ TURF_ASSERT(desired != Value(ValueTraits::Redirect));
TURF_ASSERT(m_cell); // Cell must have been found or inserted
TURF_TRACE(ConcurrentMap_Grampa, 14, "[Mutator::exchangeValue] called", uptr(m_table), uptr(m_value));
for (;;) {