summaryrefslogtreecommitdiff
path: root/src/dict.c
diff options
context:
space:
mode:
authorViktor Söderqvist <viktor.soderqvist@est.tech>2023-01-11 09:57:10 +0100
committerViktor Söderqvist <viktor.soderqvist@est.tech>2023-01-11 09:59:24 +0100
commitc84248b5d2fba04e5056bad32a5d29a5fc906e8c (patch)
treeeb124954279832505715f2a76d2634ac99d8550e /src/dict.c
parent25dc3b07571469a5fb004aa817a3852ade2f840f (diff)
downloadredis-c84248b5d2fba04e5056bad32a5d29a5fc906e8c.tar.gz
Make dictEntry opaque
Use functions for all accesses to dictEntry (except in dict.c). Dict abuses e.g. in defrag.c have been replaced by support functions provided by dict.
Diffstat (limited to 'src/dict.c')
-rw-r--r--src/dict.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/dict.c b/src/dict.c
index 90fd4f52e..418c42bbb 100644
--- a/src/dict.c
+++ b/src/dict.c
@@ -58,6 +58,22 @@
static dictResizeEnable dict_can_resize = DICT_RESIZE_ENABLE;
static unsigned int dict_force_resize_ratio = 5;
+/* -------------------------- types ----------------------------------------- */
+
+struct dictEntry {
+ void *key;
+ union {
+ void *val;
+ uint64_t u64;
+ int64_t s64;
+ double d;
+ } v;
+ struct dictEntry *next; /* Next entry in the same hash bucket. */
+ void *metadata[]; /* An arbitrary number of bytes (starting at a
+ * pointer-aligned address) of size as returned
+ * by dictType's dictEntryMetadataBytes(). */
+};
+
/* -------------------------- private prototypes ---------------------------- */
static int _dictExpandIfNeeded(dict *d);
@@ -596,6 +612,98 @@ void dictTwoPhaseUnlinkFree(dict *d, dictEntry *he, dictEntry **plink, int table
dictResumeRehashing(d);
}
+void dictSetKey(dict *d, dictEntry* de, void *key) {
+ if (d->type->keyDup)
+ de->key = d->type->keyDup(d, key);
+ else
+ de->key = key;
+}
+
+void dictSetVal(dict *d, dictEntry *de, void *val) {
+ de->v.val = d->type->valDup ? d->type->valDup(d, val) : val;
+}
+
+void dictSetSignedIntegerVal(dictEntry *de, int64_t val) {
+ de->v.s64 = val;
+}
+
+void dictSetUnsignedIntegerVal(dictEntry *de, uint64_t val) {
+ de->v.u64 = val;
+}
+
+void dictSetDoubleVal(dictEntry *de, double val) {
+ de->v.d = val;
+}
+
+int64_t dictIncrSignedIntegerVal(dictEntry *de, int64_t val) {
+ return de->v.s64 += val;
+}
+
+uint64_t dictIncrUnsignedIntegerVal(dictEntry *de, uint64_t val) {
+ return de->v.u64 += val;
+}
+
+double dictIncrDoubleVal(dictEntry *de, double val) {
+ return de->v.d += val;
+}
+
+/* Only used when the next in hash bucket has been reallocated. */
+void dictSetNext(dictEntry *de, dictEntry *next) {
+ de->next = next;
+}
+
+/* A pointer to the metadata section within the dict entry. */
+void *dictMetadata(dictEntry *de) {
+ return &de->metadata;
+}
+
+void *dictGetKey(const dictEntry *de) {
+ return de->key;
+}
+
+void *dictGetVal(const dictEntry *de) {
+ return de->v.val;
+}
+
+int64_t dictGetSignedIntegerVal(const dictEntry *de) {
+ return de->v.s64;
+}
+
+uint64_t dictGetUnsignedIntegerVal(const dictEntry *de) {
+ return de->v.u64;
+}
+
+double dictGetDoubleVal(const dictEntry *de) {
+ return de->v.d;
+}
+
+/* Returns a mutable reference to the value as a double within the entry. */
+double *dictGetDoubleValPtr(dictEntry *de) {
+ return &de->v.d;
+}
+
+/* The next entry in same hash bucket. */
+dictEntry *dictGetNext(const dictEntry *de) {
+ return de->next;
+}
+
+/* A pointer to the 'next' field within the entry, or NULL if there is no next
+ * field. */
+dictEntry **dictGetNextRef(dictEntry *de) {
+ return &de->next;
+}
+
+/* Returns the memory usage in bytes of the dict, excluding the size of the keys
+ * and values. */
+size_t dictMemUsage(const dict *d) {
+ return dictSize(d) * sizeof(dictEntry) +
+ dictSlots(d) * sizeof(dictEntry*);
+}
+
+size_t dictEntryMemUsage(void) {
+ return sizeof(dictEntry);
+}
+
/* A fingerprint is a 64 bit number that represents the state of the dictionary
* at a given time, it's just a few dict properties xored together.
* When an unsafe iterator is initialized, we get the dict fingerprint, and check