summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmoshaiov <108735540+tmoshaiov@users.noreply.github.com>2022-09-08 04:57:43 +0300
committerGitHub <noreply@github.com>2022-09-07 20:57:43 -0500
commitfb1d56bc2ae6466f4f6eac5a966936b904b5dbdc (patch)
tree1bede696af7d88a41e78801a496a879a3e544182
parentc0ce97faccb314f00cdda38a233508d38bd1b855 (diff)
downloadredis-fb1d56bc2ae6466f4f6eac5a966936b904b5dbdc.tar.gz
Added API to initialize dictionary iterators without memory allocation (#11245)
* Added api to use dictionary iterators without calling malloc.
-rw-r--r--src/dict.c33
-rw-r--r--src/dict.h3
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);