unsigned long *range_min, unsigned long *range_max)
{
unsigned long *pivots = ma_pivots(mas_mn(mas), type);
- unsigned long min = mas->min, pivot = 0;
+ unsigned long min, pivot = 0;
unsigned char i = mas_offset(mas);
- bool ret = true;
+ min = mas_safe_min(mas, pivots, i);
if (ma_is_dense(type)) {
// Linear node.
// What if mas->index != mas->last?
goto dense;
}
- if (i)
- min = mas_safe_min(mas, pivots, i);
-
while(i < mt_slots[type]) {
pivot = _mas_safe_pivot(mas, pivots, i, type);
if (!pivot && i) {
if (mas->max < mas->index) {
- i = MAPLE_NODE_SLOTS;
- ret = false;
+ mas_set_offset(mas, MAPLE_NODE_SLOTS);
+ return false;
}
pivot = mas->max;
break;
}
dense:
- if (ret) {
- *range_min = min;
- *range_max = pivot;
- }
+ *range_min = min;
+ *range_max = pivot;
mas_set_offset(mas, i);
- return ret;
+ return true;
}
/*
next = mas_get_slot(mas, mas_offset(mas));
- if (unlikely(!next))
+ if (!next)
return false;
// Traverse.
mas->max = *range_max;
mas->min = *range_min;
-
mas->node = next;
mas_set_offset(mas, 0);
}
{
enum maple_type type = mte_node_type(mas->node);
unsigned long pivot = mas->min;
- unsigned long r_start = mas->min;
+ unsigned long r_start = *range_start;
unsigned char offset = mas_offset(mas);
- unsigned char count = mt_slots[type];
unsigned long *pivots = ma_pivots(mas_mn(mas), type);
void **slots = ma_slots(mas_mn(mas), type);
- void *entry;
- r_start = mas_safe_min(mas, pivots, offset);
-
- while (offset < count) {
+ while (offset < mt_slots[type]) {
pivot = _mas_safe_pivot(mas, pivots, offset, type);
if (!pivot && offset)
goto no_entry;
if (r_start > mas->max)
goto no_entry;
- entry = mas_slot(mas, slots, offset);
- if (entry)
+ if (mas_slot(mas, slots, offset))
goto found;
/* Ran over the limit, this is was the last slot to try */
}
/*
- * _mas_range_walk(): A walk that supports returning the range in which an
+ * _mas_walk(): A walk that supports returning the range in which an
* index is located.
*
*/
-static inline bool _mas_range_walk(struct ma_state *mas,
- unsigned long *range_min, unsigned long *range_max)
+static inline bool _mas_walk(struct ma_state *mas, unsigned long *range_min,
+ unsigned long *range_max)
{
void *entry = mas_start(mas);
return __mas_walk(mas, range_min, range_max);
}
-static inline bool _mas_walk(struct ma_state *mas)
+static inline int mas_dead_node(struct ma_state *mas, unsigned long index)
{
unsigned long range_max, range_min;
- return _mas_range_walk(mas, &range_min, &range_max);
-}
-
-static inline int mas_dead_node(struct ma_state *mas, unsigned long index)
-{
if (!mas_searchable(mas))
return 0;
mas->index = index;
mas->node = MAS_START;
- _mas_walk(mas);
+ _mas_walk(mas, &range_min, &range_max);
return 1;
}
* range_min and range_max will be set accordingly.
*
*/
-void *mas_range_load(struct ma_state *mas, unsigned long *range_min,
+static inline void *mas_range_load(struct ma_state *mas, unsigned long *range_min,
unsigned long *range_max)
{
void *entry = NULL;
retry:
- if (_mas_range_walk(mas, range_min, range_max)) {
+ if (_mas_walk(mas, range_min, range_max)) {
unsigned char slot = MAPLE_NODE_SLOTS;
if (mas_is_ptr(mas) && mas->last == 0)
goto retry;
}
- if (mas_is_none(mas))
- return NULL;
-
- if (!entry)
- return NULL;
-
return entry;
}
unsigned long *range_start)
{
void *entry = NULL;
- unsigned long range_max;
- if (!mas_searchable(mas))
- return NULL;
if (mas_is_start(mas)) {// First run.
+ unsigned long range_max;
+
mas_start(mas);
*range_start = 0;
entry = mas_range_load(mas, range_start, &range_max);
mas->last = range_max;
if (entry)
return entry;
- }
+ } else if (!mas_searchable(mas))
+ return NULL;
return __mas_next(mas, limit, range_start);
}
return NULL;
rcu_read_lock();
- leaf = _mas_range_walk(&mas, &range_start, &range_end);
+ leaf = _mas_walk(&mas, &range_start, &range_end);
slot = mas_offset(&mas);
if (leaf == true && slot != MAPLE_NODE_SLOTS)
entry = mas_get_slot(&mas, slot);