mirror of https://mirror.osredm.com/root/redis.git
Added API to initialize dictionary iterators without memory allocation (#11245)
* Added api to use dictionary iterators without calling malloc.
This commit is contained in:
parent
c0ce97facc
commit
fb1d56bc2a
33
src/dict.c
33
src/dict.c
|
@ -572,16 +572,36 @@ unsigned long long dictFingerprint(dict *d) {
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
dictIterator *dictGetIterator(dict *d)
|
void dictInitIterator(dictIterator *iter, dict *d)
|
||||||
{
|
{
|
||||||
dictIterator *iter = zmalloc(sizeof(*iter));
|
|
||||||
|
|
||||||
iter->d = d;
|
iter->d = d;
|
||||||
iter->table = 0;
|
iter->table = 0;
|
||||||
iter->index = -1;
|
iter->index = -1;
|
||||||
iter->safe = 0;
|
iter->safe = 0;
|
||||||
iter->entry = NULL;
|
iter->entry = NULL;
|
||||||
iter->nextEntry = NULL;
|
iter->nextEntry = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dictInitSafeIterator(dictIterator *iter, dict *d)
|
||||||
|
{
|
||||||
|
dictInitIterator(iter, d);
|
||||||
|
iter->safe = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dictResetIterator(dictIterator *iter)
|
||||||
|
{
|
||||||
|
if (!(iter->index == -1 && iter->table == 0)) {
|
||||||
|
if (iter->safe)
|
||||||
|
dictResumeRehashing(iter->d);
|
||||||
|
else
|
||||||
|
assert(iter->fingerprint == dictFingerprint(iter->d));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dictIterator *dictGetIterator(dict *d)
|
||||||
|
{
|
||||||
|
dictIterator *iter = zmalloc(sizeof(*iter));
|
||||||
|
dictInitIterator(iter, d);
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -627,12 +647,7 @@ dictEntry *dictNext(dictIterator *iter)
|
||||||
|
|
||||||
void dictReleaseIterator(dictIterator *iter)
|
void dictReleaseIterator(dictIterator *iter)
|
||||||
{
|
{
|
||||||
if (!(iter->index == -1 && iter->table == 0)) {
|
dictResetIterator(iter);
|
||||||
if (iter->safe)
|
|
||||||
dictResumeRehashing(iter->d);
|
|
||||||
else
|
|
||||||
assert(iter->fingerprint == dictFingerprint(iter->d));
|
|
||||||
}
|
|
||||||
zfree(iter);
|
zfree(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -187,6 +187,9 @@ void *dictFetchValue(dict *d, const void *key);
|
||||||
int dictResize(dict *d);
|
int dictResize(dict *d);
|
||||||
dictIterator *dictGetIterator(dict *d);
|
dictIterator *dictGetIterator(dict *d);
|
||||||
dictIterator *dictGetSafeIterator(dict *d);
|
dictIterator *dictGetSafeIterator(dict *d);
|
||||||
|
void dictInitIterator(dictIterator *iter, dict *d);
|
||||||
|
void dictInitSafeIterator(dictIterator *iter, dict *d);
|
||||||
|
void dictResetIterator(dictIterator *iter);
|
||||||
dictEntry *dictNext(dictIterator *iter);
|
dictEntry *dictNext(dictIterator *iter);
|
||||||
void dictReleaseIterator(dictIterator *iter);
|
void dictReleaseIterator(dictIterator *iter);
|
||||||
dictEntry *dictGetRandomKey(dict *d);
|
dictEntry *dictGetRandomKey(dict *d);
|
||||||
|
|
Loading…
Reference in New Issue