Skip to content

Commit

Permalink
undoed all the sds hacking that lead just to random bugs and no memor…
Browse files Browse the repository at this point in the history
…y saving ;)
  • Loading branch information
antirez committed Oct 7, 2009
1 parent e8a7442 commit f1017b3
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 110 deletions.
12 changes: 6 additions & 6 deletions redis.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
Expand Down Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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"
Expand All @@ -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),
Expand Down
132 changes: 32 additions & 100 deletions sds.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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);
Expand All @@ -87,25 +73,16 @@ 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) {
return sdsnewlen(s, sdslen(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) {
Expand All @@ -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;
}
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand Down
6 changes: 2 additions & 4 deletions sds.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,12 @@
#define __SDS_H

#include <sys/types.h>
#include <limits.h>

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[];
};

Expand Down

0 comments on commit f1017b3

Please sign in to comment.