Commit e6621d05 authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

Add fields for subscribed channel/pattern names

parent b758e52e
...@@ -38,6 +38,47 @@ ...@@ -38,6 +38,47 @@
/* Forward declaration of function in hiredis.c */ /* Forward declaration of function in hiredis.c */
void __redisAppendCommand(redisContext *c, char *cmd, size_t len); void __redisAppendCommand(redisContext *c, char *cmd, size_t len);
/* Functions managing dictionary of callbacks for pub/sub. */
static unsigned int callbackHash(const void *key) {
return dictGenHashFunction((unsigned char*)key,sdslen((char*)key));
}
static void *callbackValDup(void *privdata, const void *src) {
((void) privdata);
redisCallback *dup = malloc(sizeof(*dup));
memcpy(dup,src,sizeof(*dup));
return dup;
}
static int callbackKeyCompare(void *privdata, const void *key1, const void *key2) {
int l1, l2;
((void) privdata);
l1 = sdslen((sds)key1);
l2 = sdslen((sds)key2);
if (l1 != l2) return 0;
return memcmp(key1,key2,l1) == 0;
}
static void callbackKeyDestructor(void *privdata, void *key) {
((void) privdata);
sdsfree((sds)key);
}
static void callbackValDestructor(void *privdata, void *val) {
((void) privdata);
free(val);
}
static dictType callbackDict = {
callbackHash,
NULL,
callbackValDup,
callbackKeyCompare,
callbackKeyDestructor,
callbackValDestructor
};
static redisAsyncContext *redisAsyncInitialize(redisContext *c) { static redisAsyncContext *redisAsyncInitialize(redisContext *c) {
redisAsyncContext *ac = realloc(c,sizeof(redisAsyncContext)); redisAsyncContext *ac = realloc(c,sizeof(redisAsyncContext));
c = &(ac->c); c = &(ac->c);
...@@ -63,6 +104,10 @@ static redisAsyncContext *redisAsyncInitialize(redisContext *c) { ...@@ -63,6 +104,10 @@ static redisAsyncContext *redisAsyncInitialize(redisContext *c) {
ac->replies.head = NULL; ac->replies.head = NULL;
ac->replies.tail = NULL; ac->replies.tail = NULL;
ac->sub.invalid.head = NULL;
ac->sub.invalid.tail = NULL;
ac->sub.channels = dictCreate(&callbackDict,NULL);
ac->sub.patterns = dictCreate(&callbackDict,NULL);
return ac; return ac;
} }
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#ifndef __HIREDIS_ASYNC_H #ifndef __HIREDIS_ASYNC_H
#define __HIREDIS_ASYNC_H #define __HIREDIS_ASYNC_H
#include "hiredis.h" #include "hiredis.h"
#include "dict.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
...@@ -88,8 +89,15 @@ typedef struct redisAsyncContext { ...@@ -88,8 +89,15 @@ typedef struct redisAsyncContext {
/* Called when the first write event was received. */ /* Called when the first write event was received. */
redisConnectCallback *onConnect; redisConnectCallback *onConnect;
/* Reply callbacks */ /* Regular command callbacks */
redisCallbackList replies; redisCallbackList replies;
/* Subscription callbacks */
struct {
redisCallbackList invalid;
dict *channels;
dict *patterns;
} sub;
} redisAsyncContext; } redisAsyncContext;
/* Functions that proxy to hiredis */ /* Functions that proxy to hiredis */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment