Unverified Commit 1407a055 authored by Oran Agra's avatar Oran Agra Committed by GitHub
Browse files

Merge pull request #7661 from michael-grunder/hiredis-unique-sds-symbols

This resolves an issue with sentinel that was created when hiredis was recently updated.
this was due to sds symbol names clashing, since hiredis now includes different implementation
of sdsrange than the one in redis.

The state of things is that redis-benchamrk and redis-cli include only hiredis sds implementation.
redis-cli even operates (calls sdscatlen) on sds that's allocated by hiredis.

Sentinel however has both implementations of the sds library in it (now each with it's own unique
symbols).
parents 11cd983d 275068c8
...@@ -54,7 +54,7 @@ void __redisSetError(redisContext *c, int type, const char *str); ...@@ -54,7 +54,7 @@ void __redisSetError(redisContext *c, int type, const char *str);
/* Functions managing dictionary of callbacks for pub/sub. */ /* Functions managing dictionary of callbacks for pub/sub. */
static unsigned int callbackHash(const void *key) { static unsigned int callbackHash(const void *key) {
return dictGenHashFunction((const unsigned char *)key, return dictGenHashFunction((const unsigned char *)key,
sdslen((const sds)key)); hi_sdslen((const hisds)key));
} }
static void *callbackValDup(void *privdata, const void *src) { static void *callbackValDup(void *privdata, const void *src) {
...@@ -73,15 +73,15 @@ static int callbackKeyCompare(void *privdata, const void *key1, const void *key2 ...@@ -73,15 +73,15 @@ static int callbackKeyCompare(void *privdata, const void *key1, const void *key2
int l1, l2; int l1, l2;
((void) privdata); ((void) privdata);
l1 = sdslen((const sds)key1); l1 = hi_sdslen((const hisds)key1);
l2 = sdslen((const sds)key2); l2 = hi_sdslen((const hisds)key2);
if (l1 != l2) return 0; if (l1 != l2) return 0;
return memcmp(key1,key2,l1) == 0; return memcmp(key1,key2,l1) == 0;
} }
static void callbackKeyDestructor(void *privdata, void *key) { static void callbackKeyDestructor(void *privdata, void *key) {
((void) privdata); ((void) privdata);
sdsfree((sds)key); hi_sdsfree((hisds)key);
} }
static void callbackValDestructor(void *privdata, void *val) { static void callbackValDestructor(void *privdata, void *val) {
...@@ -418,7 +418,7 @@ static int __redisGetSubscribeCallback(redisAsyncContext *ac, redisReply *reply, ...@@ -418,7 +418,7 @@ static int __redisGetSubscribeCallback(redisAsyncContext *ac, redisReply *reply,
dictEntry *de; dictEntry *de;
int pvariant; int pvariant;
char *stype; char *stype;
sds sname; hisds sname;
/* Custom reply functions are not supported for pub/sub. This will fail /* Custom reply functions are not supported for pub/sub. This will fail
* very hard when they are used... */ * very hard when they are used... */
...@@ -435,7 +435,7 @@ static int __redisGetSubscribeCallback(redisAsyncContext *ac, redisReply *reply, ...@@ -435,7 +435,7 @@ static int __redisGetSubscribeCallback(redisAsyncContext *ac, redisReply *reply,
/* Locate the right callback */ /* Locate the right callback */
assert(reply->element[1]->type == REDIS_REPLY_STRING); assert(reply->element[1]->type == REDIS_REPLY_STRING);
sname = sdsnewlen(reply->element[1]->str,reply->element[1]->len); sname = hi_sdsnewlen(reply->element[1]->str,reply->element[1]->len);
if (sname == NULL) if (sname == NULL)
goto oom; goto oom;
...@@ -466,7 +466,7 @@ static int __redisGetSubscribeCallback(redisAsyncContext *ac, redisReply *reply, ...@@ -466,7 +466,7 @@ static int __redisGetSubscribeCallback(redisAsyncContext *ac, redisReply *reply,
c->flags &= ~REDIS_SUBSCRIBED; c->flags &= ~REDIS_SUBSCRIBED;
} }
} }
sdsfree(sname); hi_sdsfree(sname);
} else { } else {
/* Shift callback for invalid commands. */ /* Shift callback for invalid commands. */
__redisShiftCallback(&ac->sub.invalid,dstcb); __redisShiftCallback(&ac->sub.invalid,dstcb);
...@@ -511,7 +511,7 @@ void redisProcessCallbacks(redisAsyncContext *ac) { ...@@ -511,7 +511,7 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
if (reply == NULL) { if (reply == NULL) {
/* When the connection is being disconnected and there are /* When the connection is being disconnected and there are
* no more replies, this is the cue to really disconnect. */ * no more replies, this is the cue to really disconnect. */
if (c->flags & REDIS_DISCONNECTING && sdslen(c->obuf) == 0 if (c->flags & REDIS_DISCONNECTING && hi_sdslen(c->obuf) == 0
&& ac->replies.head == NULL) { && ac->replies.head == NULL) {
__redisAsyncDisconnect(ac); __redisAsyncDisconnect(ac);
return; return;
...@@ -744,7 +744,7 @@ static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void ...@@ -744,7 +744,7 @@ static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void
const char *cstr, *astr; const char *cstr, *astr;
size_t clen, alen; size_t clen, alen;
const char *p; const char *p;
sds sname; hisds sname;
int ret; int ret;
/* Don't accept new commands when the connection is about to be closed. */ /* Don't accept new commands when the connection is about to be closed. */
...@@ -768,7 +768,7 @@ static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void ...@@ -768,7 +768,7 @@ static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void
/* Add every channel/pattern to the list of subscription callbacks. */ /* Add every channel/pattern to the list of subscription callbacks. */
while ((p = nextArgument(p,&astr,&alen)) != NULL) { while ((p = nextArgument(p,&astr,&alen)) != NULL) {
sname = sdsnewlen(astr,alen); sname = hi_sdsnewlen(astr,alen);
if (sname == NULL) if (sname == NULL)
goto oom; goto oom;
...@@ -786,7 +786,7 @@ static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void ...@@ -786,7 +786,7 @@ static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void
ret = dictReplace(cbdict,sname,&cb); ret = dictReplace(cbdict,sname,&cb);
if (ret == 0) sdsfree(sname); if (ret == 0) hi_sdsfree(sname);
} }
} else if (strncasecmp(cstr,"unsubscribe\r\n",13) == 0) { } else if (strncasecmp(cstr,"unsubscribe\r\n",13) == 0) {
/* It is only useful to call (P)UNSUBSCRIBE when the context is /* It is only useful to call (P)UNSUBSCRIBE when the context is
...@@ -845,14 +845,14 @@ int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata ...@@ -845,14 +845,14 @@ int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata
} }
int redisAsyncCommandArgv(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen) { int redisAsyncCommandArgv(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen) {
sds cmd; hisds cmd;
int len; int len;
int status; int status;
len = redisFormatSdsCommandArgv(&cmd,argc,argv,argvlen); len = redisFormatSdsCommandArgv(&cmd,argc,argv,argvlen);
if (len < 0) if (len < 0)
return REDIS_ERR; return REDIS_ERR;
status = __redisAsyncCommand(ac,fn,privdata,cmd,len); status = __redisAsyncCommand(ac,fn,privdata,cmd,len);
sdsfree(cmd); hi_sdsfree(cmd);
return status; return status;
} }
......
...@@ -305,7 +305,7 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { ...@@ -305,7 +305,7 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) {
const char *c = format; const char *c = format;
char *cmd = NULL; /* final command */ char *cmd = NULL; /* final command */
int pos; /* position in final command */ int pos; /* position in final command */
sds curarg, newarg; /* current argument */ hisds curarg, newarg; /* current argument */
int touched = 0; /* was the current argument touched? */ int touched = 0; /* was the current argument touched? */
char **curargv = NULL, **newargv = NULL; char **curargv = NULL, **newargv = NULL;
int argc = 0; int argc = 0;
...@@ -318,7 +318,7 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { ...@@ -318,7 +318,7 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) {
return -1; return -1;
/* Build the command string accordingly to protocol */ /* Build the command string accordingly to protocol */
curarg = sdsempty(); curarg = hi_sdsempty();
if (curarg == NULL) if (curarg == NULL)
return -1; return -1;
...@@ -330,15 +330,15 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { ...@@ -330,15 +330,15 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) {
if (newargv == NULL) goto memory_err; if (newargv == NULL) goto memory_err;
curargv = newargv; curargv = newargv;
curargv[argc++] = curarg; curargv[argc++] = curarg;
totlen += bulklen(sdslen(curarg)); totlen += bulklen(hi_sdslen(curarg));
/* curarg is put in argv so it can be overwritten. */ /* curarg is put in argv so it can be overwritten. */
curarg = sdsempty(); curarg = hi_sdsempty();
if (curarg == NULL) goto memory_err; if (curarg == NULL) goto memory_err;
touched = 0; touched = 0;
} }
} else { } else {
newarg = sdscatlen(curarg,c,1); newarg = hi_sdscatlen(curarg,c,1);
if (newarg == NULL) goto memory_err; if (newarg == NULL) goto memory_err;
curarg = newarg; curarg = newarg;
touched = 1; touched = 1;
...@@ -355,16 +355,16 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { ...@@ -355,16 +355,16 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) {
arg = va_arg(ap,char*); arg = va_arg(ap,char*);
size = strlen(arg); size = strlen(arg);
if (size > 0) if (size > 0)
newarg = sdscatlen(curarg,arg,size); newarg = hi_sdscatlen(curarg,arg,size);
break; break;
case 'b': case 'b':
arg = va_arg(ap,char*); arg = va_arg(ap,char*);
size = va_arg(ap,size_t); size = va_arg(ap,size_t);
if (size > 0) if (size > 0)
newarg = sdscatlen(curarg,arg,size); newarg = hi_sdscatlen(curarg,arg,size);
break; break;
case '%': case '%':
newarg = sdscat(curarg,"%"); newarg = hi_sdscat(curarg,"%");
break; break;
default: default:
/* Try to detect printf format */ /* Try to detect printf format */
...@@ -452,7 +452,7 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { ...@@ -452,7 +452,7 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) {
if (_l < sizeof(_format)-2) { if (_l < sizeof(_format)-2) {
memcpy(_format,c,_l); memcpy(_format,c,_l);
_format[_l] = '\0'; _format[_l] = '\0';
newarg = sdscatvprintf(curarg,_format,_cpy); newarg = hi_sdscatvprintf(curarg,_format,_cpy);
/* Update current position (note: outer blocks /* Update current position (note: outer blocks
* increment c twice so compensate here) */ * increment c twice so compensate here) */
...@@ -479,9 +479,9 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { ...@@ -479,9 +479,9 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) {
if (newargv == NULL) goto memory_err; if (newargv == NULL) goto memory_err;
curargv = newargv; curargv = newargv;
curargv[argc++] = curarg; curargv[argc++] = curarg;
totlen += bulklen(sdslen(curarg)); totlen += bulklen(hi_sdslen(curarg));
} else { } else {
sdsfree(curarg); hi_sdsfree(curarg);
} }
/* Clear curarg because it was put in curargv or was free'd. */ /* Clear curarg because it was put in curargv or was free'd. */
...@@ -496,10 +496,10 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { ...@@ -496,10 +496,10 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) {
pos = sprintf(cmd,"*%d\r\n",argc); pos = sprintf(cmd,"*%d\r\n",argc);
for (j = 0; j < argc; j++) { for (j = 0; j < argc; j++) {
pos += sprintf(cmd+pos,"$%zu\r\n",sdslen(curargv[j])); pos += sprintf(cmd+pos,"$%zu\r\n",hi_sdslen(curargv[j]));
memcpy(cmd+pos,curargv[j],sdslen(curargv[j])); memcpy(cmd+pos,curargv[j],hi_sdslen(curargv[j]));
pos += sdslen(curargv[j]); pos += hi_sdslen(curargv[j]);
sdsfree(curargv[j]); hi_sdsfree(curargv[j]);
cmd[pos++] = '\r'; cmd[pos++] = '\r';
cmd[pos++] = '\n'; cmd[pos++] = '\n';
} }
...@@ -521,11 +521,11 @@ memory_err: ...@@ -521,11 +521,11 @@ memory_err:
cleanup: cleanup:
if (curargv) { if (curargv) {
while(argc--) while(argc--)
sdsfree(curargv[argc]); hi_sdsfree(curargv[argc]);
hi_free(curargv); hi_free(curargv);
} }
sdsfree(curarg); hi_sdsfree(curarg);
hi_free(cmd); hi_free(cmd);
return error_type; return error_type;
...@@ -558,16 +558,16 @@ int redisFormatCommand(char **target, const char *format, ...) { ...@@ -558,16 +558,16 @@ int redisFormatCommand(char **target, const char *format, ...) {
return len; return len;
} }
/* Format a command according to the Redis protocol using an sds string and /* Format a command according to the Redis protocol using an hisds string and
* sdscatfmt for the processing of arguments. This function takes the * hi_sdscatfmt for the processing of arguments. This function takes the
* number of arguments, an array with arguments and an array with their * number of arguments, an array with arguments and an array with their
* lengths. If the latter is set to NULL, strlen will be used to compute the * lengths. If the latter is set to NULL, strlen will be used to compute the
* argument lengths. * argument lengths.
*/ */
int redisFormatSdsCommandArgv(sds *target, int argc, const char **argv, int redisFormatSdsCommandArgv(hisds *target, int argc, const char **argv,
const size_t *argvlen) const size_t *argvlen)
{ {
sds cmd, aux; hisds cmd, aux;
unsigned long long totlen; unsigned long long totlen;
int j; int j;
size_t len; size_t len;
...@@ -584,36 +584,36 @@ int redisFormatSdsCommandArgv(sds *target, int argc, const char **argv, ...@@ -584,36 +584,36 @@ int redisFormatSdsCommandArgv(sds *target, int argc, const char **argv,
} }
/* Use an SDS string for command construction */ /* Use an SDS string for command construction */
cmd = sdsempty(); cmd = hi_sdsempty();
if (cmd == NULL) if (cmd == NULL)
return -1; return -1;
/* We already know how much storage we need */ /* We already know how much storage we need */
aux = sdsMakeRoomFor(cmd, totlen); aux = hi_sdsMakeRoomFor(cmd, totlen);
if (aux == NULL) { if (aux == NULL) {
sdsfree(cmd); hi_sdsfree(cmd);
return -1; return -1;
} }
cmd = aux; cmd = aux;
/* Construct command */ /* Construct command */
cmd = sdscatfmt(cmd, "*%i\r\n", argc); cmd = hi_sdscatfmt(cmd, "*%i\r\n", argc);
for (j=0; j < argc; j++) { for (j=0; j < argc; j++) {
len = argvlen ? argvlen[j] : strlen(argv[j]); len = argvlen ? argvlen[j] : strlen(argv[j]);
cmd = sdscatfmt(cmd, "$%u\r\n", len); cmd = hi_sdscatfmt(cmd, "$%u\r\n", len);
cmd = sdscatlen(cmd, argv[j], len); cmd = hi_sdscatlen(cmd, argv[j], len);
cmd = sdscatlen(cmd, "\r\n", sizeof("\r\n")-1); cmd = hi_sdscatlen(cmd, "\r\n", sizeof("\r\n")-1);
} }
assert(sdslen(cmd)==totlen); assert(hi_sdslen(cmd)==totlen);
*target = cmd; *target = cmd;
return totlen; return totlen;
} }
void redisFreeSdsCommand(sds cmd) { void redisFreeSdsCommand(hisds cmd) {
sdsfree(cmd); hi_sdsfree(cmd);
} }
/* Format a command according to the Redis protocol. This function takes the /* Format a command according to the Redis protocol. This function takes the
...@@ -697,7 +697,7 @@ static redisContext *redisContextInit(void) { ...@@ -697,7 +697,7 @@ static redisContext *redisContextInit(void) {
c->funcs = &redisContextDefaultFuncs; c->funcs = &redisContextDefaultFuncs;
c->obuf = sdsempty(); c->obuf = hi_sdsempty();
c->reader = redisReaderCreate(); c->reader = redisReaderCreate();
c->fd = REDIS_INVALID_FD; c->fd = REDIS_INVALID_FD;
...@@ -714,7 +714,7 @@ void redisFree(redisContext *c) { ...@@ -714,7 +714,7 @@ void redisFree(redisContext *c) {
return; return;
redisNetClose(c); redisNetClose(c);
sdsfree(c->obuf); hi_sdsfree(c->obuf);
redisReaderFree(c->reader); redisReaderFree(c->reader);
hi_free(c->tcp.host); hi_free(c->tcp.host);
hi_free(c->tcp.source_addr); hi_free(c->tcp.source_addr);
...@@ -751,10 +751,10 @@ int redisReconnect(redisContext *c) { ...@@ -751,10 +751,10 @@ int redisReconnect(redisContext *c) {
redisNetClose(c); redisNetClose(c);
sdsfree(c->obuf); hi_sdsfree(c->obuf);
redisReaderFree(c->reader); redisReaderFree(c->reader);
c->obuf = sdsempty(); c->obuf = hi_sdsempty();
c->reader = redisReaderCreate(); c->reader = redisReaderCreate();
if (c->obuf == NULL || c->reader == NULL) { if (c->obuf == NULL || c->reader == NULL) {
...@@ -965,22 +965,22 @@ int redisBufferWrite(redisContext *c, int *done) { ...@@ -965,22 +965,22 @@ int redisBufferWrite(redisContext *c, int *done) {
if (c->err) if (c->err)
return REDIS_ERR; return REDIS_ERR;
if (sdslen(c->obuf) > 0) { if (hi_sdslen(c->obuf) > 0) {
ssize_t nwritten = c->funcs->write(c); ssize_t nwritten = c->funcs->write(c);
if (nwritten < 0) { if (nwritten < 0) {
return REDIS_ERR; return REDIS_ERR;
} else if (nwritten > 0) { } else if (nwritten > 0) {
if (nwritten == (ssize_t)sdslen(c->obuf)) { if (nwritten == (ssize_t)hi_sdslen(c->obuf)) {
sdsfree(c->obuf); hi_sdsfree(c->obuf);
c->obuf = sdsempty(); c->obuf = hi_sdsempty();
if (c->obuf == NULL) if (c->obuf == NULL)
goto oom; goto oom;
} else { } else {
if (sdsrange(c->obuf,nwritten,-1) < 0) goto oom; if (hi_sdsrange(c->obuf,nwritten,-1) < 0) goto oom;
} }
} }
} }
if (done != NULL) *done = (sdslen(c->obuf) == 0); if (done != NULL) *done = (hi_sdslen(c->obuf) == 0);
return REDIS_OK; return REDIS_OK;
oom: oom:
...@@ -1058,9 +1058,9 @@ int redisGetReply(redisContext *c, void **reply) { ...@@ -1058,9 +1058,9 @@ int redisGetReply(redisContext *c, void **reply) {
* the reply (or replies in pub/sub). * the reply (or replies in pub/sub).
*/ */
int __redisAppendCommand(redisContext *c, const char *cmd, size_t len) { int __redisAppendCommand(redisContext *c, const char *cmd, size_t len) {
sds newbuf; hisds newbuf;
newbuf = sdscatlen(c->obuf,cmd,len); newbuf = hi_sdscatlen(c->obuf,cmd,len);
if (newbuf == NULL) { if (newbuf == NULL) {
__redisSetError(c,REDIS_ERR_OOM,"Out of memory"); __redisSetError(c,REDIS_ERR_OOM,"Out of memory");
return REDIS_ERR; return REDIS_ERR;
...@@ -1112,7 +1112,7 @@ int redisAppendCommand(redisContext *c, const char *format, ...) { ...@@ -1112,7 +1112,7 @@ int redisAppendCommand(redisContext *c, const char *format, ...) {
} }
int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen) { int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen) {
sds cmd; hisds cmd;
int len; int len;
len = redisFormatSdsCommandArgv(&cmd,argc,argv,argvlen); len = redisFormatSdsCommandArgv(&cmd,argc,argv,argvlen);
...@@ -1122,11 +1122,11 @@ int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const s ...@@ -1122,11 +1122,11 @@ int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const s
} }
if (__redisAppendCommand(c,cmd,len) != REDIS_OK) { if (__redisAppendCommand(c,cmd,len) != REDIS_OK) {
sdsfree(cmd); hi_sdsfree(cmd);
return REDIS_ERR; return REDIS_ERR;
} }
sdsfree(cmd); hi_sdsfree(cmd);
return REDIS_OK; return REDIS_OK;
} }
......
...@@ -42,7 +42,7 @@ struct timeval; /* forward declaration */ ...@@ -42,7 +42,7 @@ struct timeval; /* forward declaration */
typedef long long ssize_t; typedef long long ssize_t;
#endif #endif
#include <stdint.h> /* uintXX_t, etc */ #include <stdint.h> /* uintXX_t, etc */
#include "sds.h" /* for sds */ #include "sds.h" /* for hisds */
#include "alloc.h" /* for allocation wrappers */ #include "alloc.h" /* for allocation wrappers */
#define HIREDIS_MAJOR 1 #define HIREDIS_MAJOR 1
...@@ -128,9 +128,9 @@ void freeReplyObject(void *reply); ...@@ -128,9 +128,9 @@ void freeReplyObject(void *reply);
int redisvFormatCommand(char **target, const char *format, va_list ap); int redisvFormatCommand(char **target, const char *format, va_list ap);
int redisFormatCommand(char **target, const char *format, ...); int redisFormatCommand(char **target, const char *format, ...);
int redisFormatCommandArgv(char **target, int argc, const char **argv, const size_t *argvlen); int redisFormatCommandArgv(char **target, int argc, const char **argv, const size_t *argvlen);
int redisFormatSdsCommandArgv(sds *target, int argc, const char ** argv, const size_t *argvlen); int redisFormatSdsCommandArgv(hisds *target, int argc, const char ** argv, const size_t *argvlen);
void redisFreeCommand(char *cmd); void redisFreeCommand(char *cmd);
void redisFreeSdsCommand(sds cmd); void redisFreeSdsCommand(hisds cmd);
enum redisConnectionType { enum redisConnectionType {
REDIS_CONN_TCP, REDIS_CONN_TCP,
......
...@@ -80,7 +80,7 @@ ssize_t redisNetRead(redisContext *c, char *buf, size_t bufcap) { ...@@ -80,7 +80,7 @@ ssize_t redisNetRead(redisContext *c, char *buf, size_t bufcap) {
} }
ssize_t redisNetWrite(redisContext *c) { ssize_t redisNetWrite(redisContext *c) {
ssize_t nwritten = send(c->fd, c->obuf, sdslen(c->obuf), 0); ssize_t nwritten = send(c->fd, c->obuf, hi_sdslen(c->obuf), 0);
if (nwritten < 0) { if (nwritten < 0) {
if ((errno == EWOULDBLOCK && !(c->flags & REDIS_BLOCK)) || (errno == EINTR)) { if ((errno == EWOULDBLOCK && !(c->flags & REDIS_BLOCK)) || (errno == EINTR)) {
/* Try again later */ /* Try again later */
......
...@@ -59,7 +59,7 @@ static void __redisReaderSetError(redisReader *r, int type, const char *str) { ...@@ -59,7 +59,7 @@ static void __redisReaderSetError(redisReader *r, int type, const char *str) {
} }
/* Clear input buffer on errors. */ /* Clear input buffer on errors. */
sdsfree(r->buf); hi_sdsfree(r->buf);
r->buf = NULL; r->buf = NULL;
r->pos = r->len = 0; r->pos = r->len = 0;
...@@ -609,7 +609,7 @@ redisReader *redisReaderCreateWithFunctions(redisReplyObjectFunctions *fn) { ...@@ -609,7 +609,7 @@ redisReader *redisReaderCreateWithFunctions(redisReplyObjectFunctions *fn) {
if (r == NULL) if (r == NULL)
return NULL; return NULL;
r->buf = sdsempty(); r->buf = hi_sdsempty();
if (r->buf == NULL) if (r->buf == NULL)
goto oom; goto oom;
...@@ -650,12 +650,12 @@ void redisReaderFree(redisReader *r) { ...@@ -650,12 +650,12 @@ void redisReaderFree(redisReader *r) {
hi_free(r->task); hi_free(r->task);
} }
sdsfree(r->buf); hi_sdsfree(r->buf);
hi_free(r); hi_free(r);
} }
int redisReaderFeed(redisReader *r, const char *buf, size_t len) { int redisReaderFeed(redisReader *r, const char *buf, size_t len) {
sds newbuf; hisds newbuf;
/* Return early when this reader is in an erroneous state. */ /* Return early when this reader is in an erroneous state. */
if (r->err) if (r->err)
...@@ -664,19 +664,19 @@ int redisReaderFeed(redisReader *r, const char *buf, size_t len) { ...@@ -664,19 +664,19 @@ int redisReaderFeed(redisReader *r, const char *buf, size_t len) {
/* Copy the provided buffer. */ /* Copy the provided buffer. */
if (buf != NULL && len >= 1) { if (buf != NULL && len >= 1) {
/* Destroy internal buffer when it is empty and is quite large. */ /* Destroy internal buffer when it is empty and is quite large. */
if (r->len == 0 && r->maxbuf != 0 && sdsavail(r->buf) > r->maxbuf) { if (r->len == 0 && r->maxbuf != 0 && hi_sdsavail(r->buf) > r->maxbuf) {
sdsfree(r->buf); hi_sdsfree(r->buf);
r->buf = sdsempty(); r->buf = hi_sdsempty();
if (r->buf == 0) goto oom; if (r->buf == 0) goto oom;
r->pos = 0; r->pos = 0;
} }
newbuf = sdscatlen(r->buf,buf,len); newbuf = hi_sdscatlen(r->buf,buf,len);
if (newbuf == NULL) goto oom; if (newbuf == NULL) goto oom;
r->buf = newbuf; r->buf = newbuf;
r->len = sdslen(r->buf); r->len = hi_sdslen(r->buf);
} }
return REDIS_OK; return REDIS_OK;
...@@ -721,9 +721,9 @@ int redisReaderGetReply(redisReader *r, void **reply) { ...@@ -721,9 +721,9 @@ int redisReaderGetReply(redisReader *r, void **reply) {
/* Discard part of the buffer when we've consumed at least 1k, to avoid /* Discard part of the buffer when we've consumed at least 1k, to avoid
* doing unnecessary calls to memmove() in sds.c. */ * doing unnecessary calls to memmove() in sds.c. */
if (r->pos >= 1024) { if (r->pos >= 1024) {
if (sdsrange(r->buf,r->pos,-1) < 0) return REDIS_ERR; if (hi_sdsrange(r->buf,r->pos,-1) < 0) return REDIS_ERR;
r->pos = 0; r->pos = 0;
r->len = sdslen(r->buf); r->len = hi_sdslen(r->buf);
} }
/* Emit a reply when there is one. */ /* Emit a reply when there is one. */
......
This diff is collapsed.
...@@ -30,10 +30,10 @@ ...@@ -30,10 +30,10 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __SDS_H #ifndef HIREDIS_SDS_H
#define __SDS_H #define HIREDIS_SDS_H
#define SDS_MAX_PREALLOC (1024*1024) #define HI_SDS_MAX_PREALLOC (1024*1024)
#ifdef _MSC_VER #ifdef _MSC_VER
#define __attribute__(x) #define __attribute__(x)
typedef long long ssize_t; typedef long long ssize_t;
...@@ -44,235 +44,235 @@ typedef long long ssize_t; ...@@ -44,235 +44,235 @@ typedef long long ssize_t;
#include <stdarg.h> #include <stdarg.h>
#include <stdint.h> #include <stdint.h>
typedef char *sds; typedef char *hisds;
/* Note: sdshdr5 is never used, we just access the flags byte directly. /* Note: sdshdr5 is never used, we just access the flags byte directly.
* However is here to document the layout of type 5 SDS strings. */ * However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 { struct __attribute__ ((__packed__)) hisdshdr5 {
unsigned char flags; /* 3 lsb of type, and 5 msb of string length */ unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
char buf[]; char buf[];
}; };
struct __attribute__ ((__packed__)) sdshdr8 { struct __attribute__ ((__packed__)) hisdshdr8 {
uint8_t len; /* used */ uint8_t len; /* used */
uint8_t alloc; /* excluding the header and null terminator */ uint8_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */ unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[]; char buf[];
}; };
struct __attribute__ ((__packed__)) sdshdr16 { struct __attribute__ ((__packed__)) hisdshdr16 {
uint16_t len; /* used */ uint16_t len; /* used */
uint16_t alloc; /* excluding the header and null terminator */ uint16_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */ unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[]; char buf[];
}; };
struct __attribute__ ((__packed__)) sdshdr32 { struct __attribute__ ((__packed__)) hisdshdr32 {
uint32_t len; /* used */ uint32_t len; /* used */
uint32_t alloc; /* excluding the header and null terminator */ uint32_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */ unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[]; char buf[];
}; };
struct __attribute__ ((__packed__)) sdshdr64 { struct __attribute__ ((__packed__)) hisdshdr64 {
uint64_t len; /* used */ uint64_t len; /* used */
uint64_t alloc; /* excluding the header and null terminator */ uint64_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */ unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[]; char buf[];
}; };
#define SDS_TYPE_5 0 #define HI_SDS_TYPE_5 0
#define SDS_TYPE_8 1 #define HI_SDS_TYPE_8 1
#define SDS_TYPE_16 2 #define HI_SDS_TYPE_16 2
#define SDS_TYPE_32 3 #define HI_SDS_TYPE_32 3
#define SDS_TYPE_64 4 #define HI_SDS_TYPE_64 4
#define SDS_TYPE_MASK 7 #define HI_SDS_TYPE_MASK 7
#define SDS_TYPE_BITS 3 #define HI_SDS_TYPE_BITS 3
#define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))); #define HI_SDS_HDR_VAR(T,s) struct hisdshdr##T *sh = (struct hisdshdr##T *)((s)-(sizeof(struct hisdshdr##T)));
#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T)))) #define HI_SDS_HDR(T,s) ((struct hisdshdr##T *)((s)-(sizeof(struct hisdshdr##T))))
#define SDS_TYPE_5_LEN(f) ((f)>>SDS_TYPE_BITS) #define HI_SDS_TYPE_5_LEN(f) ((f)>>HI_SDS_TYPE_BITS)
static inline size_t sdslen(const sds s) { static inline size_t hi_sdslen(const hisds s) {
unsigned char flags = s[-1]; unsigned char flags = s[-1];
switch(flags&SDS_TYPE_MASK) { switch(flags & HI_SDS_TYPE_MASK) {
case SDS_TYPE_5: case HI_SDS_TYPE_5:
return SDS_TYPE_5_LEN(flags); return HI_SDS_TYPE_5_LEN(flags);
case SDS_TYPE_8: case HI_SDS_TYPE_8:
return SDS_HDR(8,s)->len; return HI_SDS_HDR(8,s)->len;
case SDS_TYPE_16: case HI_SDS_TYPE_16:
return SDS_HDR(16,s)->len; return HI_SDS_HDR(16,s)->len;
case SDS_TYPE_32: case HI_SDS_TYPE_32:
return SDS_HDR(32,s)->len; return HI_SDS_HDR(32,s)->len;
case SDS_TYPE_64: case HI_SDS_TYPE_64:
return SDS_HDR(64,s)->len; return HI_SDS_HDR(64,s)->len;
} }
return 0; return 0;
} }
static inline size_t sdsavail(const sds s) { static inline size_t hi_sdsavail(const hisds s) {
unsigned char flags = s[-1]; unsigned char flags = s[-1];
switch(flags&SDS_TYPE_MASK) { switch(flags&HI_SDS_TYPE_MASK) {
case SDS_TYPE_5: { case HI_SDS_TYPE_5: {
return 0; return 0;
} }
case SDS_TYPE_8: { case HI_SDS_TYPE_8: {
SDS_HDR_VAR(8,s); HI_SDS_HDR_VAR(8,s);
return sh->alloc - sh->len; return sh->alloc - sh->len;
} }
case SDS_TYPE_16: { case HI_SDS_TYPE_16: {
SDS_HDR_VAR(16,s); HI_SDS_HDR_VAR(16,s);
return sh->alloc - sh->len; return sh->alloc - sh->len;
} }
case SDS_TYPE_32: { case HI_SDS_TYPE_32: {
SDS_HDR_VAR(32,s); HI_SDS_HDR_VAR(32,s);
return sh->alloc - sh->len; return sh->alloc - sh->len;
} }
case SDS_TYPE_64: { case HI_SDS_TYPE_64: {
SDS_HDR_VAR(64,s); HI_SDS_HDR_VAR(64,s);
return sh->alloc - sh->len; return sh->alloc - sh->len;
} }
} }
return 0; return 0;
} }
static inline void sdssetlen(sds s, size_t newlen) { static inline void hi_sdssetlen(hisds s, size_t newlen) {
unsigned char flags = s[-1]; unsigned char flags = s[-1];
switch(flags&SDS_TYPE_MASK) { switch(flags&HI_SDS_TYPE_MASK) {
case SDS_TYPE_5: case HI_SDS_TYPE_5:
{ {
unsigned char *fp = ((unsigned char*)s)-1; unsigned char *fp = ((unsigned char*)s)-1;
*fp = (unsigned char)(SDS_TYPE_5 | (newlen << SDS_TYPE_BITS)); *fp = (unsigned char)(HI_SDS_TYPE_5 | (newlen << HI_SDS_TYPE_BITS));
} }
break; break;
case SDS_TYPE_8: case HI_SDS_TYPE_8:
SDS_HDR(8,s)->len = (uint8_t)newlen; HI_SDS_HDR(8,s)->len = (uint8_t)newlen;
break; break;
case SDS_TYPE_16: case HI_SDS_TYPE_16:
SDS_HDR(16,s)->len = (uint16_t)newlen; HI_SDS_HDR(16,s)->len = (uint16_t)newlen;
break; break;
case SDS_TYPE_32: case HI_SDS_TYPE_32:
SDS_HDR(32,s)->len = (uint32_t)newlen; HI_SDS_HDR(32,s)->len = (uint32_t)newlen;
break; break;
case SDS_TYPE_64: case HI_SDS_TYPE_64:
SDS_HDR(64,s)->len = (uint64_t)newlen; HI_SDS_HDR(64,s)->len = (uint64_t)newlen;
break; break;
} }
} }
static inline void sdsinclen(sds s, size_t inc) { static inline void hi_sdsinclen(hisds s, size_t inc) {
unsigned char flags = s[-1]; unsigned char flags = s[-1];
switch(flags&SDS_TYPE_MASK) { switch(flags&HI_SDS_TYPE_MASK) {
case SDS_TYPE_5: case HI_SDS_TYPE_5:
{ {
unsigned char *fp = ((unsigned char*)s)-1; unsigned char *fp = ((unsigned char*)s)-1;
unsigned char newlen = SDS_TYPE_5_LEN(flags)+(unsigned char)inc; unsigned char newlen = HI_SDS_TYPE_5_LEN(flags)+(unsigned char)inc;
*fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS); *fp = HI_SDS_TYPE_5 | (newlen << HI_SDS_TYPE_BITS);
} }
break; break;
case SDS_TYPE_8: case HI_SDS_TYPE_8:
SDS_HDR(8,s)->len += (uint8_t)inc; HI_SDS_HDR(8,s)->len += (uint8_t)inc;
break; break;
case SDS_TYPE_16: case HI_SDS_TYPE_16:
SDS_HDR(16,s)->len += (uint16_t)inc; HI_SDS_HDR(16,s)->len += (uint16_t)inc;
break; break;
case SDS_TYPE_32: case HI_SDS_TYPE_32:
SDS_HDR(32,s)->len += (uint32_t)inc; HI_SDS_HDR(32,s)->len += (uint32_t)inc;
break; break;
case SDS_TYPE_64: case HI_SDS_TYPE_64:
SDS_HDR(64,s)->len += (uint64_t)inc; HI_SDS_HDR(64,s)->len += (uint64_t)inc;
break; break;
} }
} }
/* sdsalloc() = sdsavail() + sdslen() */ /* hi_sdsalloc() = hi_sdsavail() + hi_sdslen() */
static inline size_t sdsalloc(const sds s) { static inline size_t hi_sdsalloc(const hisds s) {
unsigned char flags = s[-1]; unsigned char flags = s[-1];
switch(flags&SDS_TYPE_MASK) { switch(flags & HI_SDS_TYPE_MASK) {
case SDS_TYPE_5: case HI_SDS_TYPE_5:
return SDS_TYPE_5_LEN(flags); return HI_SDS_TYPE_5_LEN(flags);
case SDS_TYPE_8: case HI_SDS_TYPE_8:
return SDS_HDR(8,s)->alloc; return HI_SDS_HDR(8,s)->alloc;
case SDS_TYPE_16: case HI_SDS_TYPE_16:
return SDS_HDR(16,s)->alloc; return HI_SDS_HDR(16,s)->alloc;
case SDS_TYPE_32: case HI_SDS_TYPE_32:
return SDS_HDR(32,s)->alloc; return HI_SDS_HDR(32,s)->alloc;
case SDS_TYPE_64: case HI_SDS_TYPE_64:
return SDS_HDR(64,s)->alloc; return HI_SDS_HDR(64,s)->alloc;
} }
return 0; return 0;
} }
static inline void sdssetalloc(sds s, size_t newlen) { static inline void hi_sdssetalloc(hisds s, size_t newlen) {
unsigned char flags = s[-1]; unsigned char flags = s[-1];
switch(flags&SDS_TYPE_MASK) { switch(flags&HI_SDS_TYPE_MASK) {
case SDS_TYPE_5: case HI_SDS_TYPE_5:
/* Nothing to do, this type has no total allocation info. */ /* Nothing to do, this type has no total allocation info. */
break; break;
case SDS_TYPE_8: case HI_SDS_TYPE_8:
SDS_HDR(8,s)->alloc = (uint8_t)newlen; HI_SDS_HDR(8,s)->alloc = (uint8_t)newlen;
break; break;
case SDS_TYPE_16: case HI_SDS_TYPE_16:
SDS_HDR(16,s)->alloc = (uint16_t)newlen; HI_SDS_HDR(16,s)->alloc = (uint16_t)newlen;
break; break;
case SDS_TYPE_32: case HI_SDS_TYPE_32:
SDS_HDR(32,s)->alloc = (uint32_t)newlen; HI_SDS_HDR(32,s)->alloc = (uint32_t)newlen;
break; break;
case SDS_TYPE_64: case HI_SDS_TYPE_64:
SDS_HDR(64,s)->alloc = (uint64_t)newlen; HI_SDS_HDR(64,s)->alloc = (uint64_t)newlen;
break; break;
} }
} }
sds sdsnewlen(const void *init, size_t initlen); hisds hi_sdsnewlen(const void *init, size_t initlen);
sds sdsnew(const char *init); hisds hi_sdsnew(const char *init);
sds sdsempty(void); hisds hi_sdsempty(void);
sds sdsdup(const sds s); hisds hi_sdsdup(const hisds s);
void sdsfree(sds s); void hi_sdsfree(hisds s);
sds sdsgrowzero(sds s, size_t len); hisds hi_sdsgrowzero(hisds s, size_t len);
sds sdscatlen(sds s, const void *t, size_t len); hisds hi_sdscatlen(hisds s, const void *t, size_t len);
sds sdscat(sds s, const char *t); hisds hi_sdscat(hisds s, const char *t);
sds sdscatsds(sds s, const sds t); hisds hi_sdscatsds(hisds s, const hisds t);
sds sdscpylen(sds s, const char *t, size_t len); hisds hi_sdscpylen(hisds s, const char *t, size_t len);
sds sdscpy(sds s, const char *t); hisds hi_sdscpy(hisds s, const char *t);
sds sdscatvprintf(sds s, const char *fmt, va_list ap); hisds hi_sdscatvprintf(hisds s, const char *fmt, va_list ap);
#ifdef __GNUC__ #ifdef __GNUC__
sds sdscatprintf(sds s, const char *fmt, ...) hisds hi_sdscatprintf(hisds s, const char *fmt, ...)
__attribute__((format(printf, 2, 3))); __attribute__((format(printf, 2, 3)));
#else #else
sds sdscatprintf(sds s, const char *fmt, ...); hisds hi_sdscatprintf(hisds s, const char *fmt, ...);
#endif #endif
sds sdscatfmt(sds s, char const *fmt, ...); hisds hi_sdscatfmt(hisds s, char const *fmt, ...);
sds sdstrim(sds s, const char *cset); hisds hi_sdstrim(hisds s, const char *cset);
int sdsrange(sds s, ssize_t start, ssize_t end); int hi_sdsrange(hisds s, ssize_t start, ssize_t end);
void sdsupdatelen(sds s); void hi_sdsupdatelen(hisds s);
void sdsclear(sds s); void hi_sdsclear(hisds s);
int sdscmp(const sds s1, const sds s2); int hi_sdscmp(const hisds s1, const hisds s2);
sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count); hisds *hi_sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);
void sdsfreesplitres(sds *tokens, int count); void hi_sdsfreesplitres(hisds *tokens, int count);
void sdstolower(sds s); void hi_sdstolower(hisds s);
void sdstoupper(sds s); void hi_sdstoupper(hisds s);
sds sdsfromlonglong(long long value); hisds hi_sdsfromlonglong(long long value);
sds sdscatrepr(sds s, const char *p, size_t len); hisds hi_sdscatrepr(hisds s, const char *p, size_t len);
sds *sdssplitargs(const char *line, int *argc); hisds *hi_sdssplitargs(const char *line, int *argc);
sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen); hisds hi_sdsmapchars(hisds s, const char *from, const char *to, size_t setlen);
sds sdsjoin(char **argv, int argc, char *sep); hisds hi_sdsjoin(char **argv, int argc, char *sep);
sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen); hisds hi_sdsjoinsds(hisds *argv, int argc, const char *sep, size_t seplen);
/* Low level functions exposed to the user API */ /* Low level functions exposed to the user API */
sds sdsMakeRoomFor(sds s, size_t addlen); hisds hi_sdsMakeRoomFor(hisds s, size_t addlen);
void sdsIncrLen(sds s, int incr); void hi_sdsIncrLen(hisds s, int incr);
sds sdsRemoveFreeSpace(sds s); hisds hi_sdsRemoveFreeSpace(hisds s);
size_t sdsAllocSize(sds s); size_t hi_sdsAllocSize(hisds s);
void *sdsAllocPtr(sds s); void *hi_sdsAllocPtr(hisds s);
/* Export the allocator used by SDS to the program using SDS. /* Export the allocator used by SDS to the program using SDS.
* Sometimes the program SDS is linked to, may use a different set of * Sometimes the program SDS is linked to, may use a different set of
* allocators, but may want to allocate or free things that SDS will * allocators, but may want to allocate or free things that SDS will
* respectively free or allocate. */ * respectively free or allocate. */
void *sds_malloc(size_t size); void *hi_sds_malloc(size_t size);
void *sds_realloc(void *ptr, size_t size); void *hi_sds_realloc(void *ptr, size_t size);
void sds_free(void *ptr); void hi_sds_free(void *ptr);
#ifdef REDIS_TEST #ifdef REDIS_TEST
int sdsTest(int argc, char *argv[]); int hi_sdsTest(int argc, char *argv[]);
#endif #endif
#endif #endif /* HIREDIS_SDS_H */
...@@ -39,6 +39,6 @@ ...@@ -39,6 +39,6 @@
#include "alloc.h" #include "alloc.h"
#define s_malloc hi_malloc #define hi_s_malloc hi_malloc
#define s_realloc hi_realloc #define hi_s_realloc hi_realloc
#define s_free hi_free #define hi_s_free hi_free
/*
* Copyright (c) 2020, Michael Grunder <michael dot grunder at gmail dot com>
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Redis nor the names of its contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* SDS compatibility header.
*
* This simple file maps sds types and calls to their unique hiredis symbol names.
* It's useful when we build Hiredis as a dependency of Redis and want to call
* Hiredis' sds symbols rather than the ones built into Redis, as the libraries
* have slightly diverged and could cause hard to track down ABI incompatibility
* bugs.
*
*/
#ifndef HIREDIS_SDS_COMPAT
#define HIREDIS_SDS_COMPAT
#define sds hisds
#define sdslen hi_sdslen
#define sdsavail hi_sdsavail
#define sdssetlen hi_sdssetlen
#define sdsinclen hi_sdsinclen
#define sdsalloc hi_sdsalloc
#define sdssetalloc hi_sdssetalloc
#define sdsAllocPtr hi_sdsAllocPtr
#define sdsAllocSize hi_sdsAllocSize
#define sdscat hi_sdscat
#define sdscatfmt hi_sdscatfmt
#define sdscatlen hi_sdscatlen
#define sdscatprintf hi_sdscatprintf
#define sdscatrepr hi_sdscatrepr
#define sdscatsds hi_sdscatsds
#define sdscatvprintf hi_sdscatvprintf
#define sdsclear hi_sdsclear
#define sdscmp hi_sdscmp
#define sdscpy hi_sdscpy
#define sdscpylen hi_sdscpylen
#define sdsdup hi_sdsdup
#define sdsempty hi_sdsempty
#define sds_free hi_sds_free
#define sdsfree hi_sdsfree
#define sdsfreesplitres hi_sdsfreesplitres
#define sdsfromlonglong hi_sdsfromlonglong
#define sdsgrowzero hi_sdsgrowzero
#define sdsIncrLen hi_sdsIncrLen
#define sdsjoin hi_sdsjoin
#define sdsjoinsds hi_sdsjoinsds
#define sdsll2str hi_sdsll2str
#define sdsMakeRoomFor hi_sdsMakeRoomFor
#define sds_malloc hi_sds_malloc
#define sdsmapchars hi_sdsmapchars
#define sdsnew hi_sdsnew
#define sdsnewlen hi_sdsnewlen
#define sdsrange hi_sdsrange
#define sds_realloc hi_sds_realloc
#define sdsRemoveFreeSpace hi_sdsRemoveFreeSpace
#define sdssplitargs hi_sdssplitargs
#define sdssplitlen hi_sdssplitlen
#define sdstolower hi_sdstolower
#define sdstoupper hi_sdstoupper
#define sdstrim hi_sdstrim
#define sdsull2str hi_sdsull2str
#define sdsupdatelen hi_sdsupdatelen
#endif /* HIREDIS_SDS_COMPAT */
...@@ -437,7 +437,7 @@ static ssize_t redisSSLRead(redisContext *c, char *buf, size_t bufcap) { ...@@ -437,7 +437,7 @@ static ssize_t redisSSLRead(redisContext *c, char *buf, size_t bufcap) {
static ssize_t redisSSLWrite(redisContext *c) { static ssize_t redisSSLWrite(redisContext *c) {
redisSSL *rssl = c->privctx; redisSSL *rssl = c->privctx;
size_t len = rssl->lastLen ? rssl->lastLen : sdslen(c->obuf); size_t len = rssl->lastLen ? rssl->lastLen : hi_sdslen(c->obuf);
int rv = SSL_write(rssl->ssl, c->obuf, len); int rv = SSL_write(rssl->ssl, c->obuf, len);
if (rv > 0) { if (rv > 0) {
......
...@@ -340,21 +340,21 @@ static void test_format_commands(void) { ...@@ -340,21 +340,21 @@ static void test_format_commands(void) {
len == 4+4+(3+2)+4+(7+2)+4+(3+2)); len == 4+4+(3+2)+4+(7+2)+4+(3+2));
hi_free(cmd); hi_free(cmd);
sds sds_cmd; hisds sds_cmd;
sds_cmd = NULL; sds_cmd = NULL;
test("Format command into sds by passing argc/argv without lengths: "); test("Format command into hisds by passing argc/argv without lengths: ");
len = redisFormatSdsCommandArgv(&sds_cmd,argc,argv,NULL); len = redisFormatSdsCommandArgv(&sds_cmd,argc,argv,NULL);
test_cond(strncmp(sds_cmd,"*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\nbar\r\n",len) == 0 && test_cond(strncmp(sds_cmd,"*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\nbar\r\n",len) == 0 &&
len == 4+4+(3+2)+4+(3+2)+4+(3+2)); len == 4+4+(3+2)+4+(3+2)+4+(3+2));
sdsfree(sds_cmd); hi_sdsfree(sds_cmd);
sds_cmd = NULL; sds_cmd = NULL;
test("Format command into sds by passing argc/argv with lengths: "); test("Format command into hisds by passing argc/argv with lengths: ");
len = redisFormatSdsCommandArgv(&sds_cmd,argc,argv,lens); len = redisFormatSdsCommandArgv(&sds_cmd,argc,argv,lens);
test_cond(strncmp(sds_cmd,"*3\r\n$3\r\nSET\r\n$7\r\nfoo\0xxx\r\n$3\r\nbar\r\n",len) == 0 && test_cond(strncmp(sds_cmd,"*3\r\n$3\r\nSET\r\n$7\r\nfoo\0xxx\r\n$3\r\nbar\r\n",len) == 0 &&
len == 4+4+(3+2)+4+(7+2)+4+(3+2)); len == 4+4+(3+2)+4+(7+2)+4+(3+2));
sdsfree(sds_cmd); hi_sdsfree(sds_cmd);
} }
static void test_append_formatted_commands(struct config config) { static void test_append_formatted_commands(struct config config) {
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include <math.h> #include <math.h>
#include <pthread.h> #include <pthread.h>
#include <sdscompat.h> /* Use hiredis' sds compat header that maps sds calls to their hi_ variants */
#include <sds.h> /* Use hiredis sds. */ #include <sds.h> /* Use hiredis sds. */
#include "ae.h" #include "ae.h"
#include "hiredis.h" #include "hiredis.h"
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include <openssl/err.h> #include <openssl/err.h>
#include <hiredis_ssl.h> #include <hiredis_ssl.h>
#endif #endif
#include <sdscompat.h> /* Use hiredis' sds compat header that maps sds calls to their hi_ variants */
#include <sds.h> /* use sds.h from hiredis, so that only one set of sds functions will be present in the binary */ #include <sds.h> /* use sds.h from hiredis, so that only one set of sds functions will be present in the binary */
#include "dict.h" #include "dict.h"
#include "adlist.h" #include "adlist.h"
......
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