From fb1d56bc2ae6466f4f6eac5a966936b904b5dbdc Mon Sep 17 00:00:00 2001 From: tmoshaiov <108735540+tmoshaiov@users.noreply.github.com> Date: Thu, 8 Sep 2022 04:57:43 +0300 Subject: [PATCH] Added API to initialize dictionary iterators without memory allocation (#11245) * Added api to use dictionary iterators without calling malloc. --- src/dict.c | 33 ++++++++++++++++++++++++--------- src/dict.h | 3 +++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/dict.c b/src/dict.c index e96a1ed2b..9975e7872 100644 --- a/src/dict.c +++ b/src/dict.c @@ -572,16 +572,36 @@ unsigned long long dictFingerprint(dict *d) { return hash; } -dictIterator *dictGetIterator(dict *d) +void dictInitIterator(dictIterator *iter, dict *d) { - dictIterator *iter = zmalloc(sizeof(*iter)); - iter->d = d; iter->table = 0; iter->index = -1; iter->safe = 0; iter->entry = 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; } @@ -627,12 +647,7 @@ dictEntry *dictNext(dictIterator *iter) void dictReleaseIterator(dictIterator *iter) { - if (!(iter->index == -1 && iter->table == 0)) { - if (iter->safe) - dictResumeRehashing(iter->d); - else - assert(iter->fingerprint == dictFingerprint(iter->d)); - } + dictResetIterator(iter); zfree(iter); } diff --git a/src/dict.h b/src/dict.h index 8f45b057e..d8a655ca7 100644 --- a/src/dict.h +++ b/src/dict.h @@ -187,6 +187,9 @@ void *dictFetchValue(dict *d, const void *key); int dictResize(dict *d); dictIterator *dictGetIterator(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); void dictReleaseIterator(dictIterator *iter); dictEntry *dictGetRandomKey(dict *d);