mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
Modules: dictionary API WIP #7: don't store the context.
Storing the context is useless, because we can't really reuse that later. For instance in the API RM_DictNext() that returns a RedisModuleString for the next key iterated, the user should pass the new context, because we may run the keys of the dictionary in a different context of the one where the dictionary was created. Also the dictionary may be created without a context, but we may still demand automatic memory management for the returned strings while iterating.
This commit is contained in:
parent
b6c794acf6
commit
58ac1f8bbe
15
src/module.c
15
src/module.c
@ -250,8 +250,6 @@ static client *moduleFreeContextReusedClient;
|
|||||||
|
|
||||||
/* Data structures related to the exported dictionary data structure. */
|
/* Data structures related to the exported dictionary data structure. */
|
||||||
typedef struct RedisModuleDict {
|
typedef struct RedisModuleDict {
|
||||||
RedisModuleCtx *ctx; /* May be NULL for dictionaries created
|
|
||||||
out of a module context. */
|
|
||||||
rax *rax; /* The radix tree. */
|
rax *rax; /* The radix tree. */
|
||||||
} RedisModuleDict;
|
} RedisModuleDict;
|
||||||
|
|
||||||
@ -271,7 +269,7 @@ robj **moduleCreateArgvFromUserFormat(const char *cmdname, const char *fmt, int
|
|||||||
void moduleReplicateMultiIfNeeded(RedisModuleCtx *ctx);
|
void moduleReplicateMultiIfNeeded(RedisModuleCtx *ctx);
|
||||||
void RM_ZsetRangeStop(RedisModuleKey *kp);
|
void RM_ZsetRangeStop(RedisModuleKey *kp);
|
||||||
static void zsetKeyReset(RedisModuleKey *key);
|
static void zsetKeyReset(RedisModuleKey *key);
|
||||||
void RM_FreeDict(RedisModuleDict *d);
|
void RM_FreeDict(RedisModuleCtx *ctx, RedisModuleDict *d);
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
* Heap allocation raw functions
|
* Heap allocation raw functions
|
||||||
@ -793,7 +791,7 @@ void autoMemoryCollect(RedisModuleCtx *ctx) {
|
|||||||
case REDISMODULE_AM_STRING: decrRefCount(ptr); break;
|
case REDISMODULE_AM_STRING: decrRefCount(ptr); break;
|
||||||
case REDISMODULE_AM_REPLY: RM_FreeCallReply(ptr); break;
|
case REDISMODULE_AM_REPLY: RM_FreeCallReply(ptr); break;
|
||||||
case REDISMODULE_AM_KEY: RM_CloseKey(ptr); break;
|
case REDISMODULE_AM_KEY: RM_CloseKey(ptr); break;
|
||||||
case REDISMODULE_AM_DICT: RM_FreeDict(ptr); break;
|
case REDISMODULE_AM_DICT: RM_FreeDict(NULL,ptr); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx->flags |= REDISMODULE_CTX_AUTO_MEMORY;
|
ctx->flags |= REDISMODULE_CTX_AUTO_MEMORY;
|
||||||
@ -4368,15 +4366,16 @@ int RM_GetTimerInfo(RedisModuleCtx *ctx, RedisModuleTimerID id, uint64_t *remain
|
|||||||
*/
|
*/
|
||||||
RedisModuleDict *RM_CreateDict(RedisModuleCtx *ctx) {
|
RedisModuleDict *RM_CreateDict(RedisModuleCtx *ctx) {
|
||||||
struct RedisModuleDict *d = zmalloc(sizeof(*d));
|
struct RedisModuleDict *d = zmalloc(sizeof(*d));
|
||||||
d->ctx = ctx;
|
|
||||||
d->rax = raxNew();
|
d->rax = raxNew();
|
||||||
if (ctx != NULL) autoMemoryAdd(ctx,REDISMODULE_AM_DICT,d);
|
if (ctx != NULL) autoMemoryAdd(ctx,REDISMODULE_AM_DICT,d);
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free a dictionary created with RM_CreateDict(). */
|
/* Free a dictionary created with RM_CreateDict(). You need to pass the
|
||||||
void RM_FreeDict(RedisModuleDict *d) {
|
* context pointer 'ctx' only if the dictionary was created using the
|
||||||
if (d->ctx != NULL) autoMemoryFreed(d->ctx,REDISMODULE_AM_DICT,d);
|
* context instead of passing NULL. */
|
||||||
|
void RM_FreeDict(RedisModuleCtx *ctx, RedisModuleDict *d) {
|
||||||
|
if (ctx != NULL) autoMemoryFreed(ctx,REDISMODULE_AM_DICT,d);
|
||||||
raxFree(d->rax);
|
raxFree(d->rax);
|
||||||
zfree(d);
|
zfree(d);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user