summaryrefslogtreecommitdiff
path: root/examples/redis-unstable/tests/modules/test_lazyfree.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-unstable/tests/modules/test_lazyfree.c')
-rw-r--r--examples/redis-unstable/tests/modules/test_lazyfree.c196
1 files changed, 0 insertions, 196 deletions
diff --git a/examples/redis-unstable/tests/modules/test_lazyfree.c b/examples/redis-unstable/tests/modules/test_lazyfree.c
deleted file mode 100644
index 7ba213f..0000000
--- a/examples/redis-unstable/tests/modules/test_lazyfree.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* This module emulates a linked list for lazyfree testing of modules, which
- is a simplified version of 'hellotype.c'
- */
-#include "redismodule.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <stdint.h>
-
-static RedisModuleType *LazyFreeLinkType;
-
-struct LazyFreeLinkNode {
- int64_t value;
- struct LazyFreeLinkNode *next;
-};
-
-struct LazyFreeLinkObject {
- struct LazyFreeLinkNode *head;
- size_t len; /* Number of elements added. */
-};
-
-struct LazyFreeLinkObject *createLazyFreeLinkObject(void) {
- struct LazyFreeLinkObject *o;
- o = RedisModule_Alloc(sizeof(*o));
- o->head = NULL;
- o->len = 0;
- return o;
-}
-
-void LazyFreeLinkInsert(struct LazyFreeLinkObject *o, int64_t ele) {
- struct LazyFreeLinkNode *next = o->head, *newnode, *prev = NULL;
-
- while(next && next->value < ele) {
- prev = next;
- next = next->next;
- }
- newnode = RedisModule_Alloc(sizeof(*newnode));
- newnode->value = ele;
- newnode->next = next;
- if (prev) {
- prev->next = newnode;
- } else {
- o->head = newnode;
- }
- o->len++;
-}
-
-void LazyFreeLinkReleaseObject(struct LazyFreeLinkObject *o) {
- struct LazyFreeLinkNode *cur, *next;
- cur = o->head;
- while(cur) {
- next = cur->next;
- RedisModule_Free(cur);
- cur = next;
- }
- RedisModule_Free(o);
-}
-
-/* LAZYFREELINK.INSERT key value */
-int LazyFreeLinkInsert_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
- RedisModule_AutoMemory(ctx); /* Use automatic memory management. */
-
- if (argc != 3) return RedisModule_WrongArity(ctx);
- RedisModuleKey *key = RedisModule_OpenKey(ctx,argv[1],
- REDISMODULE_READ|REDISMODULE_WRITE);
- int type = RedisModule_KeyType(key);
- if (type != REDISMODULE_KEYTYPE_EMPTY &&
- RedisModule_ModuleTypeGetType(key) != LazyFreeLinkType)
- {
- return RedisModule_ReplyWithError(ctx,REDISMODULE_ERRORMSG_WRONGTYPE);
- }
-
- long long value;
- if ((RedisModule_StringToLongLong(argv[2],&value) != REDISMODULE_OK)) {
- return RedisModule_ReplyWithError(ctx,"ERR invalid value: must be a signed 64 bit integer");
- }
-
- struct LazyFreeLinkObject *hto;
- if (type == REDISMODULE_KEYTYPE_EMPTY) {
- hto = createLazyFreeLinkObject();
- RedisModule_ModuleTypeSetValue(key,LazyFreeLinkType,hto);
- } else {
- hto = RedisModule_ModuleTypeGetValue(key);
- }
-
- LazyFreeLinkInsert(hto,value);
- RedisModule_SignalKeyAsReady(ctx,argv[1]);
-
- RedisModule_ReplyWithLongLong(ctx,hto->len);
- RedisModule_ReplicateVerbatim(ctx);
- return REDISMODULE_OK;
-}
-
-/* LAZYFREELINK.LEN key */
-int LazyFreeLinkLen_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
- RedisModule_AutoMemory(ctx); /* Use automatic memory management. */
-
- if (argc != 2) return RedisModule_WrongArity(ctx);
- RedisModuleKey *key = RedisModule_OpenKey(ctx,argv[1],
- REDISMODULE_READ);
- int type = RedisModule_KeyType(key);
- if (type != REDISMODULE_KEYTYPE_EMPTY &&
- RedisModule_ModuleTypeGetType(key) != LazyFreeLinkType)
- {
- return RedisModule_ReplyWithError(ctx,REDISMODULE_ERRORMSG_WRONGTYPE);
- }
-
- struct LazyFreeLinkObject *hto = RedisModule_ModuleTypeGetValue(key);
- RedisModule_ReplyWithLongLong(ctx,hto ? hto->len : 0);
- return REDISMODULE_OK;
-}
-
-void *LazyFreeLinkRdbLoad(RedisModuleIO *rdb, int encver) {
- if (encver != 0) {
- return NULL;
- }
- uint64_t elements = RedisModule_LoadUnsigned(rdb);
- struct LazyFreeLinkObject *hto = createLazyFreeLinkObject();
- while(elements--) {
- int64_t ele = RedisModule_LoadSigned(rdb);
- LazyFreeLinkInsert(hto,ele);
- }
- return hto;
-}
-
-void LazyFreeLinkRdbSave(RedisModuleIO *rdb, void *value) {
- struct LazyFreeLinkObject *hto = value;
- struct LazyFreeLinkNode *node = hto->head;
- RedisModule_SaveUnsigned(rdb,hto->len);
- while(node) {
- RedisModule_SaveSigned(rdb,node->value);
- node = node->next;
- }
-}
-
-void LazyFreeLinkAofRewrite(RedisModuleIO *aof, RedisModuleString *key, void *value) {
- struct LazyFreeLinkObject *hto = value;
- struct LazyFreeLinkNode *node = hto->head;
- while(node) {
- RedisModule_EmitAOF(aof,"LAZYFREELINK.INSERT","sl",key,node->value);
- node = node->next;
- }
-}
-
-void LazyFreeLinkFree(void *value) {
- LazyFreeLinkReleaseObject(value);
-}
-
-size_t LazyFreeLinkFreeEffort(RedisModuleString *key, const void *value) {
- REDISMODULE_NOT_USED(key);
- const struct LazyFreeLinkObject *hto = value;
- return hto->len;
-}
-
-void LazyFreeLinkUnlink(RedisModuleString *key, const void *value) {
- REDISMODULE_NOT_USED(key);
- REDISMODULE_NOT_USED(value);
- /* Here you can know which key and value is about to be freed. */
-}
-
-int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
- REDISMODULE_NOT_USED(argv);
- REDISMODULE_NOT_USED(argc);
-
- if (RedisModule_Init(ctx,"lazyfreetest",1,REDISMODULE_APIVER_1)
- == REDISMODULE_ERR) return REDISMODULE_ERR;
-
- /* We only allow our module to be loaded when the redis core version is greater than the version of my module */
- if (RedisModule_GetTypeMethodVersion() < REDISMODULE_TYPE_METHOD_VERSION) {
- return REDISMODULE_ERR;
- }
-
- RedisModuleTypeMethods tm = {
- .version = REDISMODULE_TYPE_METHOD_VERSION,
- .rdb_load = LazyFreeLinkRdbLoad,
- .rdb_save = LazyFreeLinkRdbSave,
- .aof_rewrite = LazyFreeLinkAofRewrite,
- .free = LazyFreeLinkFree,
- .free_effort = LazyFreeLinkFreeEffort,
- .unlink = LazyFreeLinkUnlink,
- };
-
- LazyFreeLinkType = RedisModule_CreateDataType(ctx,"test_lazy",0,&tm);
- if (LazyFreeLinkType == NULL) return REDISMODULE_ERR;
-
- if (RedisModule_CreateCommand(ctx,"lazyfreelink.insert",
- LazyFreeLinkInsert_RedisCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
- return REDISMODULE_ERR;
-
- if (RedisModule_CreateCommand(ctx,"lazyfreelink.len",
- LazyFreeLinkLen_RedisCommand,"readonly",1,1,1) == REDISMODULE_ERR)
- return REDISMODULE_ERR;
-
- return REDISMODULE_OK;
-}