From f1017b3fb318d8524210ce4d599a0b083036dee9 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 7 Oct 2009 17:34:00 +0200 Subject: [PATCH] undoed all the sds hacking that lead just to random bugs and no memory saving ;) --- redis.c | 12 +++--- sds.c | 132 ++++++++++++++------------------------------------------ sds.h | 6 +-- 3 files changed, 40 insertions(+), 110 deletions(-) diff --git a/redis.c b/redis.c index 853ea1cc..f36e3b08 100644 --- a/redis.c +++ b/redis.c @@ -3623,9 +3623,8 @@ static robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) { int prefixlen, sublen, postfixlen; /* Expoit the internal sds representation to create a sds string allocated on the stack in order to make this function faster */ struct { - int len; - unsigned short free; - unsigned short _len; /* not used here */ + long len; + long free; char buf[REDIS_SORTKEY_MAX+1]; } keyname; @@ -3649,7 +3648,6 @@ static robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) { memcpy(keyname.buf+prefixlen+sublen,p+1,postfixlen); keyname.buf[prefixlen+sublen+postfixlen] = '\0'; keyname.len = prefixlen+sublen+postfixlen; - keyname._len = USHRT_MAX; keyobj.refcount = 1; keyobj.type = REDIS_STRING; @@ -3847,9 +3845,9 @@ static void sortCommand(redisClient *c) { if (byval->encoding == REDIS_ENCODING_RAW) { vector[j].u.score = strtod(byval->ptr,NULL); } else { - if (byval->encoding == REDIS_ENCODING_INT) + if (byval->encoding == REDIS_ENCODING_INT) { vector[j].u.score = (long)byval->ptr; - else + } else assert(1 != 1); } } @@ -3936,6 +3934,7 @@ static void infoCommand(redisClient *c) { info = sdscatprintf(sdsempty(), "redis_version:%s\r\n" + "arch_bits:%s\r\n" "uptime_in_seconds:%d\r\n" "uptime_in_days:%d\r\n" "connected_clients:%d\r\n" @@ -3948,6 +3947,7 @@ static void infoCommand(redisClient *c) { "total_commands_processed:%lld\r\n" "role:%s\r\n" ,REDIS_VERSION, + (sizeof(long) == 8) ? "64" : "32", uptime, uptime/(3600*24), listLength(server.clients)-listLength(server.slaves), diff --git a/sds.c b/sds.c index b63a4a76..8e9fd96d 100644 --- a/sds.c +++ b/sds.c @@ -28,8 +28,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ - /* TODO: check if it can happen that _len+free > USHRT_MAX */ - #define SDS_ABORT_ON_OOM #include "sds.h" @@ -48,25 +46,13 @@ static void sdsOomAbort(void) { sds sdsnewlen(const void *init, size_t initlen) { struct sdshdr *sh; - if (initlen >= USHRT_MAX) { - sh = zmalloc(sizeof(struct sdshdr)+initlen+1); - sh->len = initlen; - sh->_len = USHRT_MAX; - #ifdef SDS_ABORT_ON_OOM - if (sh == NULL) sdsOomAbort(); - #else - if (sh == NULL) return NULL; - #endif - } else { - sh = zmalloc(sizeof(int)+initlen+1); - sh = (struct sdshdr*) (((char*)sh)-sizeof(int)); - #ifdef SDS_ABORT_ON_OOM - if (sh == NULL) sdsOomAbort(); - #else - if (sh == NULL) return NULL; - #endif - sh->_len = initlen; - } + sh = zmalloc(sizeof(struct sdshdr)+initlen+1); +#ifdef SDS_ABORT_ON_OOM + if (sh == NULL) sdsOomAbort(); +#else + if (sh == NULL) return NULL; +#endif + sh->len = initlen; sh->free = 0; if (initlen) { if (init) memcpy(sh->buf, init, initlen); @@ -87,10 +73,7 @@ sds sdsnew(const char *init) { size_t sdslen(const sds s) { struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr))); - if (sh->_len == USHRT_MAX) - return sh->len; - else - return sh->_len; + return sh->len; } sds sdsdup(const sds s) { @@ -98,14 +81,8 @@ sds sdsdup(const sds s) { } void sdsfree(sds s) { - struct sdshdr *sh; - if (s == NULL) return; - sh = (void*) (s-(sizeof(struct sdshdr))); - if (sh->_len == USHRT_MAX) - zfree(s-sizeof(struct sdshdr)); - else - zfree(s-sizeof(struct sdshdr)+sizeof(int)); + zfree(s-sizeof(struct sdshdr)); } size_t sdsavail(sds s) { @@ -116,73 +93,40 @@ size_t sdsavail(sds s) { void sdsupdatelen(sds s) { struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr))); int reallen = strlen(s); - - if (sh->_len == USHRT_MAX) { - sh->free += (sh->len-reallen); - sh->len = reallen; - } else { - sh->free += (sh->_len-reallen); - sh->_len = reallen; - } + sh->free += (sh->len-reallen); + sh->len = reallen; } static sds sdsMakeRoomFor(sds s, size_t addlen) { struct sdshdr *sh, *newsh; size_t free = sdsavail(s); - size_t len, newlen, newfree; + size_t len, newlen; - if (free >= addlen) { - sh = (void*) (s-(sizeof(struct sdshdr))); - if (sh->_len == USHRT_MAX) { - sh->len += addlen; - } else { - sh->_len += addlen; - } - sh->free -= addlen; - return s; - } + if (free >= addlen) return s; len = sdslen(s); sh = (void*) (s-(sizeof(struct sdshdr))); - newlen = (len+addlen); - newfree = ((addlen*2) > USHRT_MAX) ? USHRT_MAX : (addlen*2); - if (newlen+newfree >= USHRT_MAX || sh->_len == USHRT_MAX) { - if (sh->_len == USHRT_MAX) { - newsh = zrealloc(sh, sizeof(struct sdshdr)+newlen+1+newfree); - } else { - newsh = zmalloc(sizeof(struct sdshdr)+newlen+1+newfree); - if (!newsh) return NULL; - memcpy(newsh->buf,sh->buf,len); - newsh->buf[len] = '\0'; - zfree(((char*)sh)+sizeof(int)); - } + newlen = (len+addlen)*2; + newsh = zrealloc(sh, sizeof(struct sdshdr)+newlen+1); #ifdef SDS_ABORT_ON_OOM - if (newsh == NULL) sdsOomAbort(); + if (newsh == NULL) sdsOomAbort(); #else - if (newsh == NULL) return NULL; + if (newsh == NULL) return NULL; #endif - newsh->_len = USHRT_MAX; - newsh->free = newfree; - newsh->len = newlen; - } else { - newsh = zrealloc(((char*)sh)+sizeof(int), sizeof(int)+newlen+1+newfree); - newsh = (struct sdshdr*) (((char*)newsh)-sizeof(int)); -#ifdef SDS_ABORT_ON_OOM - if (newsh == NULL) sdsOomAbort(); -#else - if (newsh == NULL) return NULL; -#endif - newsh->_len = newlen; - newsh->free = newfree; - } + + newsh->free = newlen - len; return newsh->buf; } sds sdscatlen(sds s, void *t, size_t len) { + struct sdshdr *sh; size_t curlen = sdslen(s); s = sdsMakeRoomFor(s,len); if (s == NULL) return NULL; + sh = (void*) (s-(sizeof(struct sdshdr))); memcpy(s+curlen, t, len); + sh->len = curlen+len; + sh->free = sh->free-len; s[curlen+len] = '\0'; return s; } @@ -193,20 +137,18 @@ sds sdscat(sds s, char *t) { sds sdscpylen(sds s, char *t, size_t len) { struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr))); - size_t totlen; - - if (sh->_len == USHRT_MAX) { - totlen = sh->free+sh->len; - } else { - totlen = sh->free+sh->_len; - } + size_t totlen = sh->free+sh->len; if (totlen < len) { s = sdsMakeRoomFor(s,len-totlen); if (s == NULL) return NULL; + sh = (void*) (s-(sizeof(struct sdshdr))); + totlen = sh->free+sh->len; } memcpy(s, t, len); s[len] = '\0'; + sh->len = len; + sh->free = totlen-len; return s; } @@ -254,13 +196,8 @@ sds sdstrim(sds s, const char *cset) { len = (sp > ep) ? 0 : ((ep-sp)+1); if (sh->buf != sp) memmove(sh->buf, sp, len); sh->buf[len] = '\0'; - if (sh->_len == USHRT_MAX) { - sh->free = sh->free+(sh->len-len); - sh->len = len; - } else { - sh->free = sh->free+(sh->_len-len); - sh->_len = len; - } + sh->free = sh->free+(sh->len-len); + sh->len = len; return s; } @@ -287,13 +224,8 @@ sds sdsrange(sds s, long start, long end) { } if (start != 0) memmove(sh->buf, sh->buf+start, newlen); sh->buf[newlen] = 0; - if (sh->_len == USHRT_MAX) { - sh->free = sh->free+(sh->len-newlen); - sh->len = newlen; - } else { - sh->free = sh->free+(sh->_len-newlen); - sh->_len = newlen; - } + sh->free = sh->free+(sh->len-newlen); + sh->len = newlen; return s; } diff --git a/sds.h b/sds.h index 582cb2f3..0fc2c928 100644 --- a/sds.h +++ b/sds.h @@ -32,14 +32,12 @@ #define __SDS_H #include -#include typedef char *sds; struct sdshdr { - int len; - unsigned short free; - unsigned short _len; /* USHRT_MAX if it is a "long" sds string */ + long len; + long free; char buf[]; }; -- 2.45.2