Unverified Commit fb1d56bc authored by tmoshaiov's avatar tmoshaiov Committed by GitHub
Browse files

Added API to initialize dictionary iterators without memory allocation (#11245)

* Added api to use dictionary iterators without calling malloc.
parent c0ce97fa
...@@ -572,16 +572,36 @@ unsigned long long dictFingerprint(dict *d) { ...@@ -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) ...@@ -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); ...@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment