summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiahao Huang <july2993@gmail.com>2013-05-07 19:55:57 +0800
committerJiahao Huang <july2993@gmail.com>2013-05-07 19:55:57 +0800
commite3ed78d43ba1329b9f736d3141b1e90ef071d5fa (patch)
tree280daf94a230ebb535b1377c821c42cf57360a06
parent5c9f6d4f55c321aa22a4a51f9046f762fbb1655d (diff)
downloadredis-e3ed78d43ba1329b9f736d3141b1e90ef071d5fa.tar.gz
in 32bit machine, popcount don't work with a input string length up to 512 MB,
bitcount commant may return negtive integer with string length more than 256 MB
-rw-r--r--src/bitops.c4
-rw-r--r--src/redis.h2
2 files changed, 3 insertions, 3 deletions
diff --git a/src/bitops.c b/src/bitops.c
index f2d03f9b0..47f768c31 100644
--- a/src/bitops.c
+++ b/src/bitops.c
@@ -58,8 +58,8 @@ static int getBitOffsetFromArgument(redisClient *c, robj *o, size_t *offset) {
/* Count number of bits set in the binary array pointed by 's' and long
* 'count' bytes. The implementation of this function is required to
* work with a input string length up to 512 MB. */
-long popcount(void *s, long count) {
- long bits = 0;
+size_t popcount(void *s, long count) {
+ size_t bits = 0;
unsigned char *p;
uint32_t *p4 = s;
static const unsigned char bitsinbyte[256] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
diff --git a/src/redis.h b/src/redis.h
index e0fe50ffb..11fc7d662 100644
--- a/src/redis.h
+++ b/src/redis.h
@@ -984,7 +984,7 @@ long long mstime(void);
void getRandomHexChars(char *p, unsigned int len);
uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l);
void exitFromChild(int retcode);
-long popcount(void *s, long count);
+size_t popcount(void *s, long count);
void redisSetProcTitle(char *title);
/* networking.c -- Networking and Client related operations */