diff --git a/src/sds.c b/src/sds.c index 50369de1bf1601b0bdc1e642f16b476d5a037e3b..0a635701ad9bf1c6d2ac3fbb67552dd9814d9eb8 100644 --- a/src/sds.c +++ b/src/sds.c @@ -107,7 +107,11 @@ static sds sdsMakeRoomFor(sds s, size_t addlen) { if (free >= addlen) return s; len = sdslen(s); sh = (void*) (s-(sizeof(struct sdshdr))); - newlen = (len+addlen)*2; + newlen = (len+addlen); + if (newlen < SDS_MAX_PREALLOC) + newlen *= 2; + else + newlen += SDS_MAX_PREALLOC; newsh = zrealloc(sh, sizeof(struct sdshdr)+newlen+1); #ifdef SDS_ABORT_ON_OOM if (newsh == NULL) sdsOomAbort(); diff --git a/src/sds.h b/src/sds.h index aa6f1781e9b09c6ba34d5856ef089c939730aa00..902e7c65983d82b5b09dc912cb9a938d22809b11 100644 --- a/src/sds.h +++ b/src/sds.h @@ -31,6 +31,8 @@ #ifndef __SDS_H #define __SDS_H +#define SDS_MAX_PREALLOC (1024*1024) + #include #include