Optimize mempool iteration

Around ~10% improvement in own tests.
This commit is contained in:
Campbell Barton 2016-06-02 00:04:51 +10:00
parent b1704d18a1
commit 2c5dc66d5e

@ -605,19 +605,26 @@ void *BLI_mempool_iterstep(BLI_mempool_iter *iter)
*/
void *BLI_mempool_iterstep(BLI_mempool_iter *iter)
{
BLI_freenode *ret;
do {
if (LIKELY(iter->curchunk)) {
ret = (BLI_freenode *)(((char *)CHUNK_DATA(iter->curchunk)) + (iter->pool->esize * iter->curindex));
}
else {
if (UNLIKELY(iter->curchunk == NULL)) {
return NULL;
}
if (UNLIKELY(++iter->curindex == iter->pool->pchunk)) {
const unsigned int esize = iter->pool->esize;
BLI_freenode *curnode = POINTER_OFFSET(CHUNK_DATA(iter->curchunk), (esize * iter->curindex));
BLI_freenode *ret;
do {
ret = curnode;
if (++iter->curindex != iter->pool->pchunk) {
curnode = POINTER_OFFSET(curnode, esize);
}
else {
iter->curindex = 0;
iter->curchunk = iter->curchunk->next;
if (iter->curchunk == NULL) {
return NULL;
}
curnode = CHUNK_DATA(iter->curchunk);
}
} while (ret->freeword == FREEWORD);