reverted formatting, syncing with antirez/redis (WIP)
This commit is contained in:
+58
-28
@@ -14,23 +14,33 @@
|
||||
|
||||
release_hdr := $(shell sh -c './mkreleasehdr.sh')
|
||||
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
|
||||
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
|
||||
OPTIMIZATION?=-O2
|
||||
DEPENDENCY_TARGETS=hiredis linenoise lua geohash-int
|
||||
DEPENDENCY_TARGETS=hiredis linenoise lua
|
||||
NODEPS:=clean distclean
|
||||
|
||||
# Default settings
|
||||
STD=-std=c99 -pedantic -DREDIS_STATIC=''
|
||||
WARN=-Wall -W
|
||||
WARN=-Wall -W -Wno-missing-field-initializers
|
||||
OPT=$(OPTIMIZATION)
|
||||
|
||||
PREFIX?=/usr/local
|
||||
INSTALL_BIN=$(PREFIX)/bin
|
||||
INSTALL=install
|
||||
|
||||
# Default allocator
|
||||
# Default allocator defaults to Jemalloc if it's not an ARM
|
||||
MALLOC=libc
|
||||
ifneq ($(uname_M),armv6l)
|
||||
ifneq ($(uname_M),armv7l)
|
||||
ifeq ($(uname_S),Linux)
|
||||
MALLOC=jemalloc
|
||||
else
|
||||
MALLOC=libc
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# To get ARM stack traces if Redis crashes we need a special C flag.
|
||||
ifneq (,$(findstring armv,$(uname_M)))
|
||||
CFLAGS+=-funwind-tables
|
||||
endif
|
||||
|
||||
# Backwards compatibility for selecting an allocator
|
||||
@@ -53,29 +63,46 @@ endif
|
||||
# Override default settings if possible
|
||||
-include .make-settings
|
||||
|
||||
FINAL_CFLAGS=$(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS) $(REDIS_CFLAGS) -I../deps/geohash-int
|
||||
FINAL_CFLAGS=$(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS) $(REDIS_CFLAGS)
|
||||
FINAL_LDFLAGS=$(LDFLAGS) $(REDIS_LDFLAGS) $(DEBUG)
|
||||
FINAL_LIBS=-lm
|
||||
DEBUG=-g -ggdb
|
||||
|
||||
ifeq ($(uname_S),SunOS)
|
||||
# SunOS
|
||||
ifneq ($(@@),32bit)
|
||||
CFLAGS+= -m64
|
||||
LDFLAGS+= -m64
|
||||
endif
|
||||
DEBUG=-g
|
||||
DEBUG_FLAGS=-g
|
||||
export CFLAGS LDFLAGS DEBUG DEBUG_FLAGS
|
||||
INSTALL=cp -pf
|
||||
FINAL_CFLAGS+= -D__EXTENSIONS__ -D_XPG6
|
||||
FINAL_LIBS+= -ldl -lnsl -lsocket -lresolv -lpthread -lrt
|
||||
else
|
||||
ifeq ($(uname_S),Darwin)
|
||||
# Darwin (nothing to do)
|
||||
# Darwin
|
||||
FINAL_LIBS+= -ldl
|
||||
else
|
||||
ifeq ($(uname_S),AIX)
|
||||
# AIX
|
||||
FINAL_LDFLAGS+= -Wl,-bexpall
|
||||
FINAL_LIBS+= -pthread -lcrypt -lbsd
|
||||
|
||||
FINAL_LIBS+=-ldl -pthread -lcrypt -lbsd
|
||||
else
|
||||
ifeq ($(uname_S),OpenBSD)
|
||||
# OpenBSD
|
||||
FINAL_LIBS+= -lpthread
|
||||
else
|
||||
ifeq ($(uname_S),FreeBSD)
|
||||
# FreeBSD
|
||||
FINAL_LIBS+= -lpthread
|
||||
else
|
||||
# All the other OSes (notably Linux)
|
||||
FINAL_LDFLAGS+= -rdynamic
|
||||
FINAL_LIBS+= -pthread
|
||||
FINAL_LIBS+=-ldl -pthread
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -95,7 +122,7 @@ endif
|
||||
ifeq ($(MALLOC),jemalloc)
|
||||
DEPENDENCY_TARGETS+= jemalloc
|
||||
FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include
|
||||
FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a -ldl
|
||||
FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a
|
||||
endif
|
||||
|
||||
REDIS_CC=$(QUIET_CC)$(CC) $(FINAL_CFLAGS)
|
||||
@@ -117,31 +144,28 @@ endif
|
||||
|
||||
REDIS_SERVER_NAME=redis-server
|
||||
REDIS_SENTINEL_NAME=redis-sentinel
|
||||
REDIS_SERVER_OBJ=adlist.o quicklist.o ae.o anet.o dict.o server.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crc64.o bitops.o sentinel.o notify.o setproctitle.o blocked.o hyperloglog.o latency.o sparkline.o redis-check-rdb.o geo.o
|
||||
REDIS_GEOHASH_OBJ=../deps/geohash-int/geohash.o ../deps/geohash-int/geohash_helper.o
|
||||
REDIS_SERVER_OBJ=adlist.o quicklist.o ae.o anet.o dict.o server.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crc64.o bitops.o sentinel.o notify.o setproctitle.o blocked.o hyperloglog.o latency.o sparkline.o redis-check-rdb.o redis-check-aof.o geo.o lazyfree.o module.o evict.o expire.o geohash.o geohash_helper.o childinfo.o defrag.o siphash.o rax.o
|
||||
REDIS_CLI_NAME=redis-cli
|
||||
REDIS_CLI_OBJ=anet.o adlist.o redis-cli.o zmalloc.o release.o anet.o ae.o crc64.o
|
||||
REDIS_BENCHMARK_NAME=redis-benchmark
|
||||
REDIS_BENCHMARK_OBJ=ae.o anet.o redis-benchmark.o adlist.o zmalloc.o redis-benchmark.o
|
||||
REDIS_CHECK_RDB_NAME=redis-check-rdb
|
||||
REDIS_CHECK_AOF_NAME=redis-check-aof
|
||||
REDIS_CHECK_AOF_OBJ=redis-check-aof.o
|
||||
|
||||
all: $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME)
|
||||
@echo ""
|
||||
@echo "Hint: It's a good idea to run 'make test' ;)"
|
||||
@echo ""
|
||||
|
||||
Makefile.dep:
|
||||
-$(REDIS_CC) -MM *.c > Makefile.dep 2> /dev/null || true
|
||||
|
||||
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
|
||||
-include Makefile.dep
|
||||
endif
|
||||
|
||||
.PHONY: all
|
||||
|
||||
# Deps (use make dep to generate this)
|
||||
include Makefile.dep
|
||||
|
||||
dep:
|
||||
$(REDIS_CC) -MM *.c > Makefile.dep
|
||||
|
||||
.PHONY: dep
|
||||
|
||||
persist-settings: distclean
|
||||
echo STD=$(STD) >> .make-settings
|
||||
echo WARN=$(WARN) >> .make-settings
|
||||
@@ -172,7 +196,7 @@ endif
|
||||
|
||||
# redis-server
|
||||
$(REDIS_SERVER_NAME): $(REDIS_SERVER_OBJ)
|
||||
$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/lua/src/liblua.a $(REDIS_GEOHASH_OBJ) $(FINAL_LIBS)
|
||||
$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/lua/src/liblua.a $(FINAL_LIBS)
|
||||
|
||||
# redis-sentinel
|
||||
$(REDIS_SENTINEL_NAME): $(REDIS_SERVER_NAME)
|
||||
@@ -182,6 +206,10 @@ $(REDIS_SENTINEL_NAME): $(REDIS_SERVER_NAME)
|
||||
$(REDIS_CHECK_RDB_NAME): $(REDIS_SERVER_NAME)
|
||||
$(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_CHECK_RDB_NAME)
|
||||
|
||||
# redis-check-aof
|
||||
$(REDIS_CHECK_AOF_NAME): $(REDIS_SERVER_NAME)
|
||||
$(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_CHECK_AOF_NAME)
|
||||
|
||||
# redis-cli
|
||||
$(REDIS_CLI_NAME): $(REDIS_CLI_OBJ)
|
||||
$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/linenoise/linenoise.o $(FINAL_LIBS)
|
||||
@@ -190,9 +218,8 @@ $(REDIS_CLI_NAME): $(REDIS_CLI_OBJ)
|
||||
$(REDIS_BENCHMARK_NAME): $(REDIS_BENCHMARK_OBJ)
|
||||
$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a $(FINAL_LIBS)
|
||||
|
||||
# redis-check-aof
|
||||
$(REDIS_CHECK_AOF_NAME): $(REDIS_CHECK_AOF_OBJ)
|
||||
$(REDIS_LD) -o $@ $^ $(FINAL_LIBS)
|
||||
dict-benchmark: dict.c zmalloc.c sds.c siphash.c
|
||||
$(REDIS_CC) $(FINAL_CFLAGS) $^ -D DICT_BENCHMARK_MAIN -o $@ $(FINAL_LIBS)
|
||||
|
||||
# Because the jemalloc.h header is generated as a part of the jemalloc build,
|
||||
# building it should complete before building any other object. Instead of
|
||||
@@ -201,7 +228,7 @@ $(REDIS_CHECK_AOF_NAME): $(REDIS_CHECK_AOF_OBJ)
|
||||
$(REDIS_CC) -c $<
|
||||
|
||||
clean:
|
||||
rm -rf $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME) *.o *.gcda *.gcno *.gcov redis.info lcov-html
|
||||
rm -rf $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME) *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep dict-benchmark
|
||||
|
||||
.PHONY: clean
|
||||
|
||||
@@ -226,7 +253,7 @@ lcov:
|
||||
@genhtml --legend -o lcov-html redis.info
|
||||
|
||||
test-sds: sds.c sds.h
|
||||
$(REDIS_CC) sds.c zmalloc.c -DSDS_TEST_MAIN -o /tmp/sds_test
|
||||
$(REDIS_CC) sds.c zmalloc.c -DSDS_TEST_MAIN $(FINAL_LIBS) -o /tmp/sds_test
|
||||
/tmp/sds_test
|
||||
|
||||
.PHONY: lcov
|
||||
@@ -249,6 +276,9 @@ noopt:
|
||||
valgrind:
|
||||
$(MAKE) OPTIMIZATION="-O0" MALLOC="libc"
|
||||
|
||||
helgrind:
|
||||
$(MAKE) OPTIMIZATION="-O0" MALLOC="libc" CFLAGS="-D__ATOMIC_VAR_FORCE_SYNC_MACROS"
|
||||
|
||||
src/help.h:
|
||||
@../utils/generate-command-help.rb > help.h
|
||||
|
||||
|
||||
+5
-2
@@ -314,7 +314,6 @@ void loadServerConfigFromString(char *config) {
|
||||
setLogFile(server.logfile);
|
||||
#endif
|
||||
}
|
||||
|
||||
fclose(logfp);
|
||||
}
|
||||
} else if (!strcasecmp(argv[0],"always-show-logo") && argc == 2) {
|
||||
@@ -702,7 +701,7 @@ void loadServerConfigFromString(char *config) {
|
||||
goto loaderr;
|
||||
}
|
||||
} else if (!strcasecmp(argv[0],"slowlog-max-len") && argc == 2) {
|
||||
server.slowlog_max_len = (PORT_ULONG)(strtol(argv[1],NULL,10)); WIN_PORT_FIX /* cast (PORT_ULONG) */
|
||||
server.slowlog_max_len = (PORT_ULONG)(strtoll(argv[1],NULL,10)); WIN_PORT_FIX /* cast (PORT_ULONG) */
|
||||
} else if (!strcasecmp(argv[0],"client-output-buffer-limit") &&
|
||||
argc == 5)
|
||||
{
|
||||
@@ -1235,6 +1234,10 @@ void configSetCommand(client *c) {
|
||||
}
|
||||
freeMemoryIfNeeded();
|
||||
}
|
||||
} config_set_memory_field(
|
||||
"proto-max-bulk-len",server.proto_max_bulk_len) {
|
||||
} config_set_memory_field(
|
||||
"client-query-buffer-limit",server.client_max_querybuf_len) {
|
||||
} config_set_memory_field("repl-backlog-size",ll) {
|
||||
resizeReplicationBacklog(ll);
|
||||
} config_set_memory_field("auto-aof-rewrite-min-size",ll) {
|
||||
|
||||
+1
-1
@@ -145,7 +145,7 @@ void setproctitle(const char *fmt, ...);
|
||||
#else
|
||||
#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */
|
||||
#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */
|
||||
#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in PORT_LONG (pdp)*/
|
||||
#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp)*/
|
||||
|
||||
#if defined(__i386__) || defined(__x86_64__) || defined(__amd64__) || \
|
||||
defined(vax) || defined(ns32000) || defined(sun386) || \
|
||||
|
||||
@@ -435,7 +435,7 @@ void flushallCommand(client *c) {
|
||||
server.dirty += emptyDb(-1,flags,NULL);
|
||||
addReply(c,shared.ok);
|
||||
if (server.rdb_child_pid != -1) {
|
||||
IF_WIN32(AbortForkOperation(), kill(server.rdb_child_pid, SIGUSR1));
|
||||
IF_WIN32(AbortForkOperation(), kill(server.rdb_child_pid,SIGUSR1));
|
||||
rdbRemoveTempFile(server.rdb_child_pid);
|
||||
}
|
||||
if (server.saveparamslen > 0) {
|
||||
@@ -584,7 +584,7 @@ void scanCallback(void *privdata, const dictEntry *de) {
|
||||
int parseScanCursorOrReply(client *c, robj *o, PORT_ULONG *cursor) {
|
||||
char *eptr;
|
||||
|
||||
/* Use strtoul() because we need an *unsigned* PORT_LONG, so
|
||||
/* Use strtoul() because we need an *unsigned* long, so
|
||||
* getLongLongFromObject() does not cover the whole cursor space. */
|
||||
errno = 0;
|
||||
*cursor = strtoul(o->ptr, &eptr, 10);
|
||||
|
||||
+3
-3
@@ -56,7 +56,7 @@
|
||||
|
||||
/* ================================= Debugging ============================== */
|
||||
|
||||
/* Compute the sha1 of string at 's' with 'len' bytes PORT_LONG.
|
||||
/* Compute the sha1 of string at 's' with 'len' bytes long.
|
||||
* The SHA1 is then xored against the string pointed by digest.
|
||||
* Since xor is commutative, this operation is used in order to
|
||||
* "add" digests relative to unordered elements.
|
||||
@@ -1044,7 +1044,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
|
||||
"Redis %s crashed by signal: %d", REDIS_VERSION, sig);
|
||||
if (eip != NULL) {
|
||||
serverLog(LL_WARNING,
|
||||
"Crashed running the instuction at: %p", eip);
|
||||
"Crashed running the instruction at: %p", eip);
|
||||
}
|
||||
if (sig == SIGSEGV || sig == SIGBUS) {
|
||||
serverLog(LL_WARNING,
|
||||
@@ -1143,7 +1143,7 @@ void serverLogHexDump(int level, char *descr, void *value, size_t len) {
|
||||
unsigned char *v = value;
|
||||
char charset[] = "0123456789abcdef";
|
||||
|
||||
serverLog(level,"%s (hexdump of %Iu bytes):", descr, len);
|
||||
serverLog(level,"%s (hexdump of %Iu bytes):", descr, len); WIN_PORT_FIX /* %zu -> %Iu */
|
||||
b = buf;
|
||||
while(len) {
|
||||
b[0] = charset[(*v)>>4];
|
||||
|
||||
+3
-3
@@ -308,7 +308,7 @@ int dictAdd(dict *d, void *key, void *val)
|
||||
*/
|
||||
dictEntry *dictAddRaw(dict *d, void *key, dictEntry **existing)
|
||||
{
|
||||
int index;
|
||||
PORT_LONG index;
|
||||
dictEntry *entry;
|
||||
dictht *ht;
|
||||
|
||||
@@ -636,7 +636,7 @@ dictEntry *dictGetRandomKey(dict *d)
|
||||
do {
|
||||
/* We are sure there are no elements in indexes from 0
|
||||
* to rehashidx-1 */
|
||||
h = (PORT_ULONG) (d->rehashidx + (random() % (d->ht[0].size + WIN_PORT_FIX /* cast (unsigned int) */
|
||||
h = (PORT_ULONG) (d->rehashidx + (random() % (d->ht[0].size + WIN_PORT_FIX /* cast (PORT_ULONG) */
|
||||
d->ht[1].size -
|
||||
d->rehashidx)));
|
||||
he = (h >= d->ht[0].size) ? d->ht[1].table[h - d->ht[0].size] :
|
||||
@@ -960,7 +960,7 @@ static PORT_ULONG _dictNextPower(PORT_ULONG size)
|
||||
{
|
||||
PORT_ULONG i = DICT_HT_INITIAL_SIZE;
|
||||
|
||||
if (size >= PORT_LONG_MAX) return PORT_LONG_MAX;
|
||||
if (size >= PORT_LONG_MAX) return PORT_LONG_MAX + 1LU;
|
||||
while(1) {
|
||||
if (i >= size)
|
||||
return i;
|
||||
|
||||
+1
-1
@@ -412,7 +412,7 @@ int freeMemoryIfNeeded(void) {
|
||||
latencyStartMonitor(latency);
|
||||
while (mem_freed < mem_tofree) {
|
||||
int j, k, i, keys_freed = 0;
|
||||
static int next_db = 0;
|
||||
static unsigned int next_db = 0;
|
||||
sds bestkey = NULL;
|
||||
int bestdbid;
|
||||
redisDb *db;
|
||||
|
||||
+31
-9
@@ -103,7 +103,7 @@ void activeExpireCycle(int type) {
|
||||
|
||||
int j, iteration = 0;
|
||||
int dbs_per_call = CRON_DBS_PER_CALL;
|
||||
PORT_LONGLONG start = ustime(), timelimit;
|
||||
PORT_LONGLONG start = ustime(), timelimit, elapsed;
|
||||
|
||||
/* When clients are paused the dataset should be static not just from the
|
||||
* POV of clients not being able to write, but also from the POV of
|
||||
@@ -111,7 +111,7 @@ void activeExpireCycle(int type) {
|
||||
if (clientsArePaused()) return;
|
||||
|
||||
if (type == ACTIVE_EXPIRE_CYCLE_FAST) {
|
||||
/* Don't start a fast cycle if the previous cycle did not exited
|
||||
/* Don't start a fast cycle if the previous cycle did not exit
|
||||
* for time limt. Also don't repeat a fast cycle for the same period
|
||||
* as the fast cycle total duration itself. */
|
||||
if (!timelimit_exit) return;
|
||||
@@ -140,7 +140,13 @@ void activeExpireCycle(int type) {
|
||||
if (type == ACTIVE_EXPIRE_CYCLE_FAST)
|
||||
timelimit = ACTIVE_EXPIRE_CYCLE_FAST_DURATION; /* in microseconds. */
|
||||
|
||||
for (j = 0; j < dbs_per_call; j++) {
|
||||
/* Accumulate some global stats as we expire keys, to have some idea
|
||||
* about the number of keys that are already logically expired, but still
|
||||
* existing inside the database. */
|
||||
long total_sampled = 0;
|
||||
long total_expired = 0;
|
||||
|
||||
for (j = 0; j < dbs_per_call && timelimit_exit == 0; j++) {
|
||||
int expired;
|
||||
redisDb *db = server.db+(current_db % server.dbnum);
|
||||
|
||||
@@ -155,6 +161,7 @@ void activeExpireCycle(int type) {
|
||||
PORT_ULONG num, slots;
|
||||
PORT_LONGLONG now, ttl_sum;
|
||||
int ttl_samples;
|
||||
iteration++;
|
||||
|
||||
/* If there is nothing to expire try next DB ASAP. */
|
||||
if ((num = dictSize(db->expires)) == 0) {
|
||||
@@ -191,7 +198,9 @@ void activeExpireCycle(int type) {
|
||||
ttl_sum += ttl;
|
||||
ttl_samples++;
|
||||
}
|
||||
total_sampled++;
|
||||
}
|
||||
total_expired += expired;
|
||||
|
||||
/* Update the average TTL stats for this database. */
|
||||
if (ttl_samples) {
|
||||
@@ -207,18 +216,31 @@ void activeExpireCycle(int type) {
|
||||
/* We can't block forever here even if there are many keys to
|
||||
* expire. So after a given amount of milliseconds return to the
|
||||
* caller waiting for the other active expire cycle. */
|
||||
iteration++;
|
||||
if ((iteration & 0xf) == 0) { /* check once every 16 iterations. */
|
||||
PORT_LONGLONG elapsed = ustime()-start;
|
||||
|
||||
latencyAddSampleIfNeeded("expire-cycle",elapsed/1000);
|
||||
if (elapsed > timelimit) timelimit_exit = 1;
|
||||
elapsed = ustime()-start;
|
||||
if (elapsed > timelimit) {
|
||||
timelimit_exit = 1;
|
||||
server.stat_expired_time_cap_reached_count++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (timelimit_exit) return;
|
||||
/* We don't repeat the cycle if there are less than 25% of keys
|
||||
* found expired in the current DB. */
|
||||
} while (expired > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP/4);
|
||||
}
|
||||
|
||||
elapsed = ustime()-start;
|
||||
latencyAddSampleIfNeeded("expire-cycle",elapsed/1000);
|
||||
|
||||
/* Update our estimate of keys existing but yet to be expired.
|
||||
* Running average with this sample accounting for 5%. */
|
||||
double current_perc;
|
||||
if (total_sampled) {
|
||||
current_perc = (double)total_expired/total_sampled;
|
||||
} else
|
||||
current_perc = 0;
|
||||
server.stat_expired_stale_perc = (current_perc*0.05)+
|
||||
(server.stat_expired_stale_perc*0.95);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
|
||||
+4
-10
@@ -611,11 +611,7 @@ int hllSparseToDense(robj *o) {
|
||||
} else {
|
||||
runlen = HLL_SPARSE_VAL_LEN(p);
|
||||
regval = HLL_SPARSE_VAL_VALUE(p);
|
||||
if ((runlen + idx) > HLL_REGISTERS) break; /* Overflow. */
|
||||
if ((runlen + idx) > HLL_REGISTERS) {
|
||||
sdsfree(dense);
|
||||
return C_ERR;
|
||||
}
|
||||
if ((runlen + idx) > HLL_REGISTERS) break; /* Overflow. */
|
||||
while(runlen--) {
|
||||
HLL_DENSE_SET_REGISTER(hdr->registers,idx,regval);
|
||||
idx++;
|
||||
@@ -701,7 +697,7 @@ int hllSparseSet(robj *o, PORT_LONG index, uint8_t count) {
|
||||
p += oplen;
|
||||
first += span;
|
||||
}
|
||||
if (span == 0) return -1; /* Invalid format. */
|
||||
if (span == 0 || p >= end) return -1; /* Invalid format. */
|
||||
|
||||
next = HLL_SPARSE_IS_XZERO(p) ? p+2 : p+1;
|
||||
if (next >= end) next = NULL;
|
||||
@@ -1086,10 +1082,8 @@ int hllMerge(uint8_t *max, robj *hll) {
|
||||
} else {
|
||||
runlen = HLL_SPARSE_VAL_LEN(p);
|
||||
regval = HLL_SPARSE_VAL_VALUE(p);
|
||||
if ((runlen + i) > HLL_REGISTERS)
|
||||
return C_ERR;
|
||||
if ((runlen + i) > HLL_REGISTERS) break; /* Overflow. */
|
||||
while(runlen--) {
|
||||
if ((runlen + i) > HLL_REGISTERS) break; /* Overflow. */
|
||||
while(runlen--) {
|
||||
if (regval > max[i]) max[i] = (uint8_t)regval; WIN_PORT_FIX /* cast (uint8_t) */
|
||||
i++;
|
||||
}
|
||||
|
||||
+116
-131
@@ -39,13 +39,13 @@
|
||||
#include "zmalloc.h"
|
||||
#include "endianconv.h"
|
||||
|
||||
/* Note that these encodings are ordered, so:
|
||||
* INTSET_ENC_INT16 < INTSET_ENC_INT32 < INTSET_ENC_INT64. */
|
||||
/* Note that these encodings are ordered, so:
|
||||
* INTSET_ENC_INT16 < INTSET_ENC_INT32 < INTSET_ENC_INT64. */
|
||||
#define INTSET_ENC_INT16 (sizeof(int16_t))
|
||||
#define INTSET_ENC_INT32 (sizeof(int32_t))
|
||||
#define INTSET_ENC_INT64 (sizeof(int64_t))
|
||||
|
||||
/* Return the required encoding for the provided value. */
|
||||
/* Return the required encoding for the provided value. */
|
||||
static uint8_t _intsetValueEncoding(int64_t v) {
|
||||
if (v < INT32_MIN || v > INT32_MAX)
|
||||
return INTSET_ENC_INT64;
|
||||
@@ -62,17 +62,15 @@ static int64_t _intsetGetEncoded(intset *is, int pos, uint8_t enc) {
|
||||
int16_t v16;
|
||||
|
||||
if (enc == INTSET_ENC_INT64) {
|
||||
memcpy(&v64, ((int64_t*) is->contents) + pos, sizeof(v64));
|
||||
memcpy(&v64,((int64_t*)is->contents)+pos,sizeof(v64));
|
||||
memrev64ifbe(&v64);
|
||||
return v64;
|
||||
}
|
||||
else if (enc == INTSET_ENC_INT32) {
|
||||
memcpy(&v32, ((int32_t*) is->contents) + pos, sizeof(v32));
|
||||
} else if (enc == INTSET_ENC_INT32) {
|
||||
memcpy(&v32,((int32_t*)is->contents)+pos,sizeof(v32));
|
||||
memrev32ifbe(&v32);
|
||||
return v32;
|
||||
}
|
||||
else {
|
||||
memcpy(&v16, ((int16_t*) is->contents) + pos, sizeof(v16));
|
||||
} else {
|
||||
memcpy(&v16,((int16_t*)is->contents)+pos,sizeof(v16));
|
||||
memrev16ifbe(&v16);
|
||||
return v16;
|
||||
}
|
||||
@@ -80,7 +78,7 @@ static int64_t _intsetGetEncoded(intset *is, int pos, uint8_t enc) {
|
||||
|
||||
/* Return the value at pos, using the configured encoding. */
|
||||
static int64_t _intsetGet(intset *is, int pos) {
|
||||
return _intsetGetEncoded(is, pos, intrev32ifbe(is->encoding));
|
||||
return _intsetGetEncoded(is,pos,intrev32ifbe(is->encoding));
|
||||
}
|
||||
|
||||
/* Set the value at pos, using the configured encoding. */
|
||||
@@ -88,16 +86,14 @@ static void _intsetSet(intset *is, int pos, int64_t value) {
|
||||
uint32_t encoding = intrev32ifbe(is->encoding);
|
||||
|
||||
if (encoding == INTSET_ENC_INT64) {
|
||||
((int64_t*) is->contents)[pos] = value;
|
||||
memrev64ifbe(((int64_t*) is->contents) + pos);
|
||||
}
|
||||
else if (encoding == INTSET_ENC_INT32) {
|
||||
((int32_t*) is->contents)[pos] = (int32_t) value; WIN_PORT_FIX /* cast (int32_t) */
|
||||
memrev32ifbe(((int32_t*) is->contents) + pos);
|
||||
}
|
||||
else {
|
||||
((int16_t*) is->contents)[pos] = (int16_t) value; WIN_PORT_FIX /* cast (int16_t) */
|
||||
memrev16ifbe(((int16_t*) is->contents) + pos);
|
||||
((int64_t*)is->contents)[pos] = value;
|
||||
memrev64ifbe(((int64_t*)is->contents)+pos);
|
||||
} else if (encoding == INTSET_ENC_INT32) {
|
||||
((int32_t*)is->contents)[pos] = (int32_t)value; WIN_PORT_FIX /* cast (int32_t) */
|
||||
memrev32ifbe(((int32_t*)is->contents)+pos);
|
||||
} else {
|
||||
((int16_t*)is->contents)[pos] = (int16_t)value; WIN_PORT_FIX /* cast (int16_t) */
|
||||
memrev16ifbe(((int16_t*)is->contents)+pos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +108,7 @@ intset *intsetNew(void) {
|
||||
/* Resize the intset */
|
||||
static intset *intsetResize(intset *is, uint32_t len) {
|
||||
uint32_t size = len*intrev32ifbe(is->encoding);
|
||||
is = zrealloc(is, sizeof(intset) + size);
|
||||
is = zrealloc(is,sizeof(intset)+size);
|
||||
return is;
|
||||
}
|
||||
|
||||
@@ -121,37 +117,33 @@ static intset *intsetResize(intset *is, uint32_t len) {
|
||||
* the value is not present in the intset and sets "pos" to the position
|
||||
* where "value" can be inserted. */
|
||||
static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos) {
|
||||
int min = 0, max = intrev32ifbe(is->length) - 1, mid = -1;
|
||||
int min = 0, max = intrev32ifbe(is->length)-1, mid = -1;
|
||||
int64_t cur = -1;
|
||||
|
||||
/* The value can never be found when the set is empty */
|
||||
if (intrev32ifbe(is->length) == 0) {
|
||||
if (pos) *pos = 0;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* Check for the case where we know we cannot find the value,
|
||||
* but do know the insert position. */
|
||||
if (value > _intsetGet(is, intrev32ifbe(is->length) - 1)) {
|
||||
if (value > _intsetGet(is,intrev32ifbe(is->length)-1)) {
|
||||
if (pos) *pos = intrev32ifbe(is->length);
|
||||
return 0;
|
||||
}
|
||||
else if (value < _intsetGet(is, 0)) {
|
||||
} else if (value < _intsetGet(is,0)) {
|
||||
if (pos) *pos = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
while (max >= min) {
|
||||
mid = ((unsigned int) min + (unsigned int) max) >> 1;
|
||||
cur = _intsetGet(is, mid);
|
||||
while(max >= min) {
|
||||
mid = ((unsigned int)min + (unsigned int)max) >> 1;
|
||||
cur = _intsetGet(is,mid);
|
||||
if (value > cur) {
|
||||
min = mid + 1;
|
||||
}
|
||||
else if (value < cur) {
|
||||
max = mid - 1;
|
||||
}
|
||||
else {
|
||||
min = mid+1;
|
||||
} else if (value < cur) {
|
||||
max = mid-1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -159,8 +151,7 @@ static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos) {
|
||||
if (value == cur) {
|
||||
if (pos) *pos = mid;
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if (pos) *pos = min;
|
||||
return 0;
|
||||
}
|
||||
@@ -175,44 +166,42 @@ static intset *intsetUpgradeAndAdd(intset *is, int64_t value) {
|
||||
|
||||
/* First set new encoding and resize */
|
||||
is->encoding = intrev32ifbe(newenc);
|
||||
is = intsetResize(is, intrev32ifbe(is->length) + 1);
|
||||
is = intsetResize(is,intrev32ifbe(is->length)+1);
|
||||
|
||||
/* Upgrade back-to-front so we don't overwrite values.
|
||||
* Note that the "prepend" variable is used to make sure we have an empty
|
||||
* space at either the beginning or the end of the intset. */
|
||||
while (length--)
|
||||
_intsetSet(is, length + prepend, _intsetGetEncoded(is, length, curenc));
|
||||
while(length--)
|
||||
_intsetSet(is,length+prepend,_intsetGetEncoded(is,length,curenc));
|
||||
|
||||
/* Set the value at the beginning or the end. */
|
||||
if (prepend)
|
||||
_intsetSet(is, 0, value);
|
||||
_intsetSet(is,0,value);
|
||||
else
|
||||
_intsetSet(is, intrev32ifbe(is->length), value);
|
||||
is->length = intrev32ifbe(intrev32ifbe(is->length) + 1);
|
||||
_intsetSet(is,intrev32ifbe(is->length),value);
|
||||
is->length = intrev32ifbe(intrev32ifbe(is->length)+1);
|
||||
return is;
|
||||
}
|
||||
|
||||
static void intsetMoveTail(intset *is, uint32_t from, uint32_t to) {
|
||||
void *src, *dst;
|
||||
uint32_t bytes = intrev32ifbe(is->length) - from;
|
||||
uint32_t bytes = intrev32ifbe(is->length)-from;
|
||||
uint32_t encoding = intrev32ifbe(is->encoding);
|
||||
|
||||
if (encoding == INTSET_ENC_INT64) {
|
||||
src = (int64_t*) is->contents + from;
|
||||
dst = (int64_t*) is->contents + to;
|
||||
src = (int64_t*)is->contents+from;
|
||||
dst = (int64_t*)is->contents+to;
|
||||
bytes *= sizeof(int64_t);
|
||||
}
|
||||
else if (encoding == INTSET_ENC_INT32) {
|
||||
src = (int32_t*) is->contents + from;
|
||||
dst = (int32_t*) is->contents + to;
|
||||
} else if (encoding == INTSET_ENC_INT32) {
|
||||
src = (int32_t*)is->contents+from;
|
||||
dst = (int32_t*)is->contents+to;
|
||||
bytes *= sizeof(int32_t);
|
||||
}
|
||||
else {
|
||||
src = (int16_t*) is->contents + from;
|
||||
dst = (int16_t*) is->contents + to;
|
||||
} else {
|
||||
src = (int16_t*)is->contents+from;
|
||||
dst = (int16_t*)is->contents+to;
|
||||
bytes *= sizeof(int16_t);
|
||||
}
|
||||
memmove(dst, src, bytes);
|
||||
memmove(dst,src,bytes);
|
||||
}
|
||||
|
||||
/* Insert an integer in the intset */
|
||||
@@ -226,23 +215,22 @@ intset *intsetAdd(intset *is, int64_t value, uint8_t *success) {
|
||||
* because it lies outside the range of existing values. */
|
||||
if (valenc > intrev32ifbe(is->encoding)) {
|
||||
/* This always succeeds, so we don't need to curry *success. */
|
||||
return intsetUpgradeAndAdd(is, value);
|
||||
}
|
||||
else {
|
||||
return intsetUpgradeAndAdd(is,value);
|
||||
} else {
|
||||
/* Abort if the value is already present in the set.
|
||||
* This call will populate "pos" with the right position to insert
|
||||
* the value when it cannot be found. */
|
||||
if (intsetSearch(is, value, &pos)) {
|
||||
if (intsetSearch(is,value,&pos)) {
|
||||
if (success) *success = 0;
|
||||
return is;
|
||||
}
|
||||
|
||||
is = intsetResize(is, intrev32ifbe(is->length) + 1);
|
||||
if (pos < intrev32ifbe(is->length)) intsetMoveTail(is, pos, pos + 1);
|
||||
is = intsetResize(is,intrev32ifbe(is->length)+1);
|
||||
if (pos < intrev32ifbe(is->length)) intsetMoveTail(is,pos,pos+1);
|
||||
}
|
||||
|
||||
_intsetSet(is, pos, value);
|
||||
is->length = intrev32ifbe(intrev32ifbe(is->length) + 1);
|
||||
_intsetSet(is,pos,value);
|
||||
is->length = intrev32ifbe(intrev32ifbe(is->length)+1);
|
||||
return is;
|
||||
}
|
||||
|
||||
@@ -252,16 +240,16 @@ intset *intsetRemove(intset *is, int64_t value, int *success) {
|
||||
uint32_t pos;
|
||||
if (success) *success = 0;
|
||||
|
||||
if (valenc <= intrev32ifbe(is->encoding) && intsetSearch(is, value, &pos)) {
|
||||
if (valenc <= intrev32ifbe(is->encoding) && intsetSearch(is,value,&pos)) {
|
||||
uint32_t len = intrev32ifbe(is->length);
|
||||
|
||||
/* We know we can delete */
|
||||
if (success) *success = 1;
|
||||
|
||||
/* Overwrite value with tail and update length */
|
||||
if (pos < (len - 1)) intsetMoveTail(is, pos + 1, pos);
|
||||
is = intsetResize(is, len - 1);
|
||||
is->length = intrev32ifbe(len - 1);
|
||||
if (pos < (len-1)) intsetMoveTail(is,pos+1,pos);
|
||||
is = intsetResize(is,len-1);
|
||||
is->length = intrev32ifbe(len-1);
|
||||
}
|
||||
return is;
|
||||
}
|
||||
@@ -269,19 +257,19 @@ intset *intsetRemove(intset *is, int64_t value, int *success) {
|
||||
/* Determine whether a value belongs to this set */
|
||||
uint8_t intsetFind(intset *is, int64_t value) {
|
||||
uint8_t valenc = _intsetValueEncoding(value);
|
||||
return valenc <= intrev32ifbe(is->encoding) && intsetSearch(is, value, NULL);
|
||||
return valenc <= intrev32ifbe(is->encoding) && intsetSearch(is,value,NULL);
|
||||
}
|
||||
|
||||
/* Return random member */
|
||||
int64_t intsetRandom(intset *is) {
|
||||
return _intsetGet(is, rand() % intrev32ifbe(is->length));
|
||||
return _intsetGet(is,rand()%intrev32ifbe(is->length));
|
||||
}
|
||||
|
||||
/* Get the value at the given position. When this position is
|
||||
* out of range the function returns 0, when in range it returns 1. */
|
||||
uint8_t intsetGet(intset *is, uint32_t pos, int64_t *value) {
|
||||
if (pos < intrev32ifbe(is->length)) {
|
||||
*value = _intsetGet(is, pos);
|
||||
*value = _intsetGet(is,pos);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@@ -294,7 +282,7 @@ uint32_t intsetLen(const intset *is) {
|
||||
|
||||
/* Return intset blob size in bytes. */
|
||||
size_t intsetBlobLen(intset *is) {
|
||||
return sizeof(intset) + intrev32ifbe(is->length)*intrev32ifbe(is->encoding);
|
||||
return sizeof(intset)+intrev32ifbe(is->length)*intrev32ifbe(is->encoding);
|
||||
}
|
||||
|
||||
#ifdef REDIS_TEST
|
||||
@@ -304,7 +292,7 @@ size_t intsetBlobLen(intset *is) {
|
||||
#if 0
|
||||
static void intsetRepr(intset *is) {
|
||||
for (uint32_t i = 0; i < intrev32ifbe(is->length); i++) {
|
||||
printf("%lld\n", (uint64_t) _intsetGet(is, i));
|
||||
printf("%lld\n", (uint64_t)_intsetGet(is,i));
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
@@ -321,48 +309,45 @@ static void ok(void) {
|
||||
|
||||
static PORT_LONGLONG usec(void) {
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
return (((PORT_LONGLONG) tv.tv_sec) * 1000000) + tv.tv_usec;
|
||||
gettimeofday(&tv,NULL);
|
||||
return (((PORT_LONGLONG)tv.tv_sec)*1000000)+tv.tv_usec;
|
||||
}
|
||||
|
||||
#define assert(_e) ((_e)?(void)0:(_assert(#_e,__FILE__,__LINE__),exit(1)))
|
||||
static void _assert(char *estr, char *file, int line) {
|
||||
printf("\n\n=== ASSERTION FAILED ===\n");
|
||||
printf("==> %s:%d '%s' is not true\n", file, line, estr);
|
||||
printf("==> %s:%d '%s' is not true\n",file,line,estr);
|
||||
}
|
||||
|
||||
static intset *createSet(int bits, int size) {
|
||||
uint64_t mask = (1 << bits) - 1;
|
||||
uint64_t mask = (1<<bits)-1;
|
||||
uint64_t value;
|
||||
intset *is = intsetNew();
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (bits > 32) {
|
||||
value = (rand()*rand()) & mask;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
value = rand() & mask;
|
||||
}
|
||||
is = intsetAdd(is, value, NULL);
|
||||
is = intsetAdd(is,value,NULL);
|
||||
}
|
||||
return is;
|
||||
}
|
||||
|
||||
static void checkConsistency(intset *is) {
|
||||
for (uint32_t i = 0; i < (intrev32ifbe(is->length) - 1); i++) {
|
||||
for (uint32_t i = 0; i < (intrev32ifbe(is->length)-1); i++) {
|
||||
uint32_t encoding = intrev32ifbe(is->encoding);
|
||||
|
||||
if (encoding == INTSET_ENC_INT16) {
|
||||
int16_t *i16 = (int16_t*) is->contents;
|
||||
assert(i16[i] < i16[i + 1]);
|
||||
}
|
||||
else if (encoding == INTSET_ENC_INT32) {
|
||||
int32_t *i32 = (int32_t*) is->contents;
|
||||
assert(i32[i] < i32[i + 1]);
|
||||
}
|
||||
else {
|
||||
int64_t *i64 = (int64_t*) is->contents;
|
||||
assert(i64[i] < i64[i + 1]);
|
||||
int16_t *i16 = (int16_t*)is->contents;
|
||||
assert(i16[i] < i16[i+1]);
|
||||
} else if (encoding == INTSET_ENC_INT32) {
|
||||
int32_t *i32 = (int32_t*)is->contents;
|
||||
assert(i32[i] < i32[i+1]);
|
||||
} else {
|
||||
int64_t *i64 = (int64_t*)is->contents;
|
||||
assert(i64[i] < i64[i+1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -387,18 +372,18 @@ int intsetTest(int argc, char **argv) {
|
||||
assert(_intsetValueEncoding(-2147483649) == INTSET_ENC_INT64);
|
||||
assert(_intsetValueEncoding(+2147483648) == INTSET_ENC_INT64);
|
||||
assert(_intsetValueEncoding(-9223372036854775808ull) ==
|
||||
INTSET_ENC_INT64);
|
||||
INTSET_ENC_INT64);
|
||||
assert(_intsetValueEncoding(+9223372036854775807ull) ==
|
||||
INTSET_ENC_INT64);
|
||||
INTSET_ENC_INT64);
|
||||
ok();
|
||||
}
|
||||
|
||||
printf("Basic adding: "); {
|
||||
is = intsetNew();
|
||||
is = intsetAdd(is, 5, &success); assert(success);
|
||||
is = intsetAdd(is, 6, &success); assert(success);
|
||||
is = intsetAdd(is, 4, &success); assert(success);
|
||||
is = intsetAdd(is, 4, &success); assert(!success);
|
||||
is = intsetAdd(is,5,&success); assert(success);
|
||||
is = intsetAdd(is,6,&success); assert(success);
|
||||
is = intsetAdd(is,4,&success); assert(success);
|
||||
is = intsetAdd(is,4,&success); assert(!success);
|
||||
ok();
|
||||
}
|
||||
|
||||
@@ -406,7 +391,7 @@ int intsetTest(int argc, char **argv) {
|
||||
uint32_t inserts = 0;
|
||||
is = intsetNew();
|
||||
for (i = 0; i < 1024; i++) {
|
||||
is = intsetAdd(is, rand() % 0x800, &success);
|
||||
is = intsetAdd(is,rand()%0x800,&success);
|
||||
if (success) inserts++;
|
||||
}
|
||||
assert(intrev32ifbe(is->length) == inserts);
|
||||
@@ -416,63 +401,63 @@ int intsetTest(int argc, char **argv) {
|
||||
|
||||
printf("Upgrade from int16 to int32: "); {
|
||||
is = intsetNew();
|
||||
is = intsetAdd(is, 32, NULL);
|
||||
is = intsetAdd(is,32,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT16);
|
||||
is = intsetAdd(is, 65535, NULL);
|
||||
is = intsetAdd(is,65535,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT32);
|
||||
assert(intsetFind(is, 32));
|
||||
assert(intsetFind(is, 65535));
|
||||
assert(intsetFind(is,32));
|
||||
assert(intsetFind(is,65535));
|
||||
checkConsistency(is);
|
||||
|
||||
is = intsetNew();
|
||||
is = intsetAdd(is, 32, NULL);
|
||||
is = intsetAdd(is,32,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT16);
|
||||
is = intsetAdd(is, -65535, NULL);
|
||||
is = intsetAdd(is,-65535,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT32);
|
||||
assert(intsetFind(is, 32));
|
||||
assert(intsetFind(is, -65535));
|
||||
assert(intsetFind(is,32));
|
||||
assert(intsetFind(is,-65535));
|
||||
checkConsistency(is);
|
||||
ok();
|
||||
}
|
||||
|
||||
printf("Upgrade from int16 to int64: "); {
|
||||
is = intsetNew();
|
||||
is = intsetAdd(is, 32, NULL);
|
||||
is = intsetAdd(is,32,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT16);
|
||||
is = intsetAdd(is, 4294967295, NULL);
|
||||
is = intsetAdd(is,4294967295,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT64);
|
||||
assert(intsetFind(is, 32));
|
||||
assert(intsetFind(is, 4294967295));
|
||||
assert(intsetFind(is,32));
|
||||
assert(intsetFind(is,4294967295));
|
||||
checkConsistency(is);
|
||||
|
||||
is = intsetNew();
|
||||
is = intsetAdd(is, 32, NULL);
|
||||
is = intsetAdd(is,32,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT16);
|
||||
is = intsetAdd(is, -4294967295, NULL);
|
||||
is = intsetAdd(is,-4294967295,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT64);
|
||||
assert(intsetFind(is, 32));
|
||||
assert(intsetFind(is, -4294967295));
|
||||
assert(intsetFind(is,32));
|
||||
assert(intsetFind(is,-4294967295));
|
||||
checkConsistency(is);
|
||||
ok();
|
||||
}
|
||||
|
||||
printf("Upgrade from int32 to int64: "); {
|
||||
is = intsetNew();
|
||||
is = intsetAdd(is, 65535, NULL);
|
||||
is = intsetAdd(is,65535,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT32);
|
||||
is = intsetAdd(is, 4294967295, NULL);
|
||||
is = intsetAdd(is,4294967295,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT64);
|
||||
assert(intsetFind(is, 65535));
|
||||
assert(intsetFind(is, 4294967295));
|
||||
assert(intsetFind(is,65535));
|
||||
assert(intsetFind(is,4294967295));
|
||||
checkConsistency(is);
|
||||
|
||||
is = intsetNew();
|
||||
is = intsetAdd(is, 65535, NULL);
|
||||
is = intsetAdd(is,65535,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT32);
|
||||
is = intsetAdd(is, -4294967295, NULL);
|
||||
is = intsetAdd(is,-4294967295,NULL);
|
||||
assert(intrev32ifbe(is->encoding) == INTSET_ENC_INT64);
|
||||
assert(intsetFind(is, 65535));
|
||||
assert(intsetFind(is, -4294967295));
|
||||
assert(intsetFind(is,65535));
|
||||
assert(intsetFind(is,-4294967295));
|
||||
checkConsistency(is);
|
||||
ok();
|
||||
}
|
||||
@@ -481,13 +466,13 @@ int intsetTest(int argc, char **argv) {
|
||||
PORT_LONG num = 100000, size = 10000;
|
||||
int i, bits = 20;
|
||||
PORT_LONGLONG start;
|
||||
is = createSet(bits, size);
|
||||
is = createSet(bits,size);
|
||||
checkConsistency(is);
|
||||
|
||||
start = usec();
|
||||
for (i = 0; i < num; i++) intsetSearch(is, rand() % ((1 << bits) - 1), NULL);
|
||||
for (i = 0; i < num; i++) intsetSearch(is,rand() % ((1<<bits)-1),NULL);
|
||||
printf("%ld lookups, %ld element set, %lldusec\n",
|
||||
num, size, usec() - start);
|
||||
num,size,usec()-start);
|
||||
}
|
||||
|
||||
printf("Stress add+delete: "); {
|
||||
@@ -495,12 +480,12 @@ int intsetTest(int argc, char **argv) {
|
||||
is = intsetNew();
|
||||
for (i = 0; i < 0xffff; i++) {
|
||||
v1 = rand() % 0xfff;
|
||||
is = intsetAdd(is, v1, NULL);
|
||||
assert(intsetFind(is, v1));
|
||||
is = intsetAdd(is,v1,NULL);
|
||||
assert(intsetFind(is,v1));
|
||||
|
||||
v2 = rand() % 0xfff;
|
||||
is = intsetRemove(is, v2, NULL);
|
||||
assert(!intsetFind(is, v2));
|
||||
is = intsetRemove(is,v2,NULL);
|
||||
assert(!intsetFind(is,v2));
|
||||
}
|
||||
checkConsistency(is);
|
||||
ok();
|
||||
@@ -508,4 +493,4 @@ int intsetTest(int argc, char **argv) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -122,7 +122,7 @@ void latencyAddSample(char *event, mstime_t latency) {
|
||||
|
||||
ts->samples[ts->idx].time = (int32_t)time(NULL); WIN_PORT_FIX /* cast (int32_t) */
|
||||
ts->samples[ts->idx].latency = (int32_t)latency; WIN_PORT_FIX /* cast (int32_t) */
|
||||
|
||||
|
||||
ts->idx++;
|
||||
if (ts->idx == LATENCY_TS_LEN) ts->idx = 0;
|
||||
}
|
||||
|
||||
+5
-1
@@ -79,7 +79,11 @@
|
||||
* Unconditionally aligning does not cost very much, so do it if unsure
|
||||
*/
|
||||
#ifndef STRICT_ALIGN
|
||||
# define STRICT_ALIGN !(defined(__i386) || defined (__amd64))
|
||||
# if !(defined(__i386) || defined (__amd64))
|
||||
# define STRICT_ALIGN 1
|
||||
# else
|
||||
# define STRICT_ALIGN 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
+1
-1
@@ -111,7 +111,7 @@ void memtest_progress_step(size_t curr, size_t size, char c) {
|
||||
* ASAP big issues with the memory subsystem. */
|
||||
int memtest_addressing(PORT_ULONG *l, size_t bytes, int interactive) {
|
||||
PORT_ULONG words = (PORT_ULONG)(bytes/sizeof(PORT_ULONG));
|
||||
PORT_ULONG j,*p;
|
||||
PORT_ULONG j, *p;
|
||||
|
||||
/* Fill */
|
||||
p = l;
|
||||
|
||||
+600
-638
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user