diff --git a/src/Makefile b/src/Makefile index 8f429431baafece2a64d3cce5273bf76b81adfa1..691b5aaea76fd0fa3e82b61f4062554104ede99e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -272,6 +272,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 diff --git a/src/server.c b/src/server.c index 75268b8a4b6428e98d74b35a2b472bef123a6e54..e50ec63597383fdefdebd9a6f6bc501e5d9c788a 100644 --- a/src/server.c +++ b/src/server.c @@ -923,7 +923,8 @@ void databasesCron(void) { * every object access, and accuracy is not needed. To access a global var is * a lot faster than calling time(NULL) */ void updateCachedTime(void) { - server.unixtime = time(NULL); + time_t unixtime = time(NULL); + atomicSet(server.unixtime,unixtime); server.mstime = mstime(); } @@ -1331,6 +1332,10 @@ void createSharedObjects(void) { void initServerConfig(void) { int j; + pthread_mutex_init(&server.next_client_id_mutex,NULL); + pthread_mutex_init(&server.lruclock_mutex,NULL); + pthread_mutex_init(&server.unixtime_mutex,NULL); + getRandomHexChars(server.runid,CONFIG_RUN_ID_SIZE); server.runid[CONFIG_RUN_ID_SIZE] = '\0'; changeReplicationId(); @@ -1423,7 +1428,6 @@ void initServerConfig(void) { server.cluster_announce_bus_port = CONFIG_DEFAULT_CLUSTER_ANNOUNCE_BUS_PORT; server.migrate_cached_sockets = dictCreate(&migrateCacheDictType,NULL); server.next_client_id = 1; /* Client IDs, start from 1 .*/ - pthread_mutex_init(&server.next_client_id_mutex,NULL); server.loading_process_events_interval_bytes = (1024*1024*2); server.lazyfree_lazy_eviction = CONFIG_DEFAULT_LAZYFREE_LAZY_EVICTION; server.lazyfree_lazy_expire = CONFIG_DEFAULT_LAZYFREE_LAZY_EXPIRE; @@ -1432,7 +1436,6 @@ void initServerConfig(void) { server.lua_time_limit = LUA_SCRIPT_TIME_LIMIT; unsigned int lruclock = getLRUClock(); - pthread_mutex_init(&server.lruclock_mutex,NULL); atomicSet(server.lruclock,lruclock); resetServerSaveParams(); diff --git a/src/server.h b/src/server.h index 12ccd8c0bd3e595f4f992987eddb8e0241203aa8..8403ed5ba66e73b1427462d83c2337e138567883 100644 --- a/src/server.h +++ b/src/server.h @@ -861,7 +861,6 @@ struct redisServer { dict *orig_commands; /* Command table before command renaming. */ aeEventLoop *el; unsigned int lruclock; /* Clock for LRU eviction */ - pthread_mutex_t lruclock_mutex; int shutdown_asap; /* SHUTDOWN needed ASAP */ int activerehashing; /* Incremental rehash in serverCron() */ int active_defrag_running; /* Active defragmentation running (holds current scan aggressiveness) */ @@ -901,7 +900,6 @@ struct redisServer { char neterr[ANET_ERR_LEN]; /* Error buffer for anet.c */ dict *migrate_cached_sockets;/* MIGRATE cached sockets */ uint64_t next_client_id; /* Next client unique ID. Incremental. */ - pthread_mutex_t next_client_id_mutex; int protected_mode; /* Don't accept external connections. */ /* RDB / AOF loading information */ int loading; /* We are loading data from disk if true */ @@ -1173,6 +1171,12 @@ struct redisServer { int watchdog_period; /* Software watchdog period in ms. 0 = off */ /* System hardware info */ size_t system_memory_size; /* Total memory in system as reported by OS */ + + /* Mutexes used to protect atomic variables when atomic builtins are + * not available. */ + pthread_mutex_t lruclock_mutex; + pthread_mutex_t next_client_id_mutex; + pthread_mutex_t unixtime_mutex; }; typedef struct pubsubPattern {