diff --git a/deps/hiredis/hiredis.c b/deps/hiredis/hiredis.c
index 49dd807d0fe89ca807627ca124e4b308a207fb54..c7710a4d6a53c960a8d4985b254a7652692dd81d 100644
--- a/deps/hiredis/hiredis.c
+++ b/deps/hiredis/hiredis.c
@@ -1023,13 +1023,14 @@ static redisContext *redisContextInit(void) {
}
void redisFree(redisContext *c) {
- if (c->fd > 0)
+ if (c->fd > 0) {
#ifdef _WIN32
closesocket(c->fd);
smRemoveSocket(c->fd);
#else
close(c->fd);
#endif
+ }
if (c->obuf != NULL)
sdsfree(c->obuf);
if (c->reader != NULL)
diff --git a/deps/hiredis/net.c b/deps/hiredis/net.c
index 81cdad98e82408d71df60e5f342dbe8d00201e2b..a49f6e0fb191db7eaa35c936521401cb0801d093 100644
--- a/deps/hiredis/net.c
+++ b/deps/hiredis/net.c
@@ -367,8 +367,13 @@ int redisContextPreConnectTcp(redisContext *c, const char *addr, int port,
int blocking = (c->flags & REDIS_BLOCK);
unsigned long inAddress;
- if ((s = redisCreateSocket(c,AF_INET)) < 0)
+ if ((s = redisCreateSocket(c,AF_INET)) < 0) {
return REDIS_ERR;
+ }
+ else {
+ smAddSocket(s);
+ }
+
sa->sin_family = AF_INET;
sa->sin_port = htons(port);
diff --git a/msvs/RedisBenchmark/RedisBenchmark.vcxproj b/msvs/RedisBenchmark/RedisBenchmark.vcxproj
index 00e5e10c1d0eff80fc72029cd2f80f7dea8146a5..80340f97e4cac2d92fa6270b1f95b63114ff91ba 100644
--- a/msvs/RedisBenchmark/RedisBenchmark.vcxproj
+++ b/msvs/RedisBenchmark/RedisBenchmark.vcxproj
@@ -90,7 +90,7 @@
Disabled
_WIN32IOCP;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
$(SolutionDir)..\deps\hiredis;
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4996
@@ -108,7 +108,7 @@
Disabled
_WIN32IOCP;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
$(SolutionDir)..\deps\hiredis;
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4996
@@ -128,7 +128,7 @@
true
_WIN32IOCP;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
$(SolutionDir)..\deps\hiredis;
- MultiThreaded
+ MultiThreadedDLL
4996
@@ -150,7 +150,7 @@
true
_WIN32IOCP;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
$(SolutionDir)..\deps\hiredis;
- MultiThreaded
+ MultiThreadedDLL
4996
diff --git a/msvs/RedisCheckAof/RedisCheckAof.vcxproj b/msvs/RedisCheckAof/RedisCheckAof.vcxproj
index be36aad8cb26b83e0b50877268edd130d42ae6e9..2fb5b2d1badd9b059a9f39958bd9e5874d162fff 100644
--- a/msvs/RedisCheckAof/RedisCheckAof.vcxproj
+++ b/msvs/RedisCheckAof/RedisCheckAof.vcxproj
@@ -83,7 +83,7 @@
Disabled
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
4996
- MultiThreadedDebug
+ MultiThreadedDebugDLL
true
@@ -97,7 +97,7 @@
Disabled
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
4996
- MultiThreadedDebug
+ MultiThreadedDebugDLL
true
@@ -113,7 +113,7 @@
true
WIN32;_CONSOLE;%(PreprocessorDefinitions)
4996
- MultiThreaded
+ MultiThreadedDLL
true
@@ -131,7 +131,7 @@
true
WIN32;_CONSOLE;%(PreprocessorDefinitions)
4996
- MultiThreaded
+ MultiThreadedDLL
true
diff --git a/msvs/RedisCheckDump/RedisCheckDump.vcxproj b/msvs/RedisCheckDump/RedisCheckDump.vcxproj
index 65ff9e8b5cf49106c12e2d9b5ae3407ca5e5a66a..ad1dc46a460a2b51db17aed910bdecadfbc739b6 100644
--- a/msvs/RedisCheckDump/RedisCheckDump.vcxproj
+++ b/msvs/RedisCheckDump/RedisCheckDump.vcxproj
@@ -82,7 +82,7 @@
Level3
Disabled
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4996
@@ -96,7 +96,7 @@
Level3
Disabled
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4996
@@ -112,7 +112,7 @@
true
true
WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- MultiThreaded
+ MultiThreadedDLL
4996
@@ -130,7 +130,7 @@
true
true
WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- MultiThreaded
+ MultiThreadedDLL
4996
diff --git a/msvs/RedisCli/RedisCli.vcxproj b/msvs/RedisCli/RedisCli.vcxproj
index bada5c0ef4d4f9272fe48831ccf4d9fde56e73ac..1b72cd241737b9dfe51b9d44f0b4978c7edfe540 100644
--- a/msvs/RedisCli/RedisCli.vcxproj
+++ b/msvs/RedisCli/RedisCli.vcxproj
@@ -83,7 +83,7 @@
Disabled
$(SolutionDir)..\deps\hiredis;$(SolutionDir)..\deps\linenoise
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4996
@@ -99,7 +99,7 @@
Disabled
$(SolutionDir)..\deps\hiredis;$(SolutionDir)..\deps\linenoise
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4996
@@ -117,7 +117,7 @@
true
$(SolutionDir)..\deps\hiredis;$(SolutionDir)..\deps\linenoise
WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- MultiThreaded
+ MultiThreadedDLL
4996
@@ -137,7 +137,7 @@
true
$(SolutionDir)..\deps\hiredis;$(SolutionDir)..\deps\linenoise
WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- MultiThreaded
+ MultiThreadedDLL
4996
diff --git a/msvs/RedisServer.vcxproj b/msvs/RedisServer.vcxproj
index 8450400c7ab26d570b78df63b2db7a249c308579..f2032816d42dfa3d0489e8efff319a4aa29e4c6b 100644
--- a/msvs/RedisServer.vcxproj
+++ b/msvs/RedisServer.vcxproj
@@ -83,7 +83,7 @@
_WIN32IOCP;WIN32;_DEBUG;_CONSOLE;__x86_64__;%(PreprocessorDefinitions)
$(SolutionDir)..\deps\lua\src;$(SolutionDir)..\deps\hiredis
- MultiThreadedDebug
+ MultiThreadedDebugDLL
Level3
ProgramDatabase
Disabled
@@ -101,7 +101,7 @@
_WIN32IOCP;WIN32;_DEBUG;_CONSOLE;__x86_64__;%(PreprocessorDefinitions)
$(SolutionDir)..\deps\lua\src;$(SolutionDir)..\deps\hiredis
- MultiThreadedDebug
+ MultiThreadedDebugDLL
Level3
ProgramDatabase
Disabled
@@ -118,7 +118,7 @@
_WIN32IOCP;WIN32;NDEBUG;_CONSOLE;__x86_64__;%(PreprocessorDefinitions)
$(SolutionDir)..\deps\lua\src;$(SolutionDir)..\deps\hiredis
- MultiThreaded
+ MultiThreadedDLL
Level3
ProgramDatabase
4996;4146
@@ -137,7 +137,7 @@
_WIN32IOCP;WIN32;NDEBUG;_CONSOLE;__x86_64__;%(PreprocessorDefinitions)
$(SolutionDir)..\deps\lua\src;$(SolutionDir)..\deps\hiredis
- MultiThreaded
+ MultiThreadedDLL
Level3
ProgramDatabase
4996;4146
diff --git a/msvs/hiredis/hiredis.vcxproj b/msvs/hiredis/hiredis.vcxproj
index 88e7973b58fc4c981c27410d8316a75eba5cad3a..cca27bb6278de4b287ed17d4248eafb72959ce57 100644
--- a/msvs/hiredis/hiredis.vcxproj
+++ b/msvs/hiredis/hiredis.vcxproj
@@ -84,7 +84,7 @@
Level3
Disabled
WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4996
@@ -98,7 +98,7 @@
Level3
Disabled
WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4996
@@ -114,7 +114,7 @@
true
true
WIN32;%(PreprocessorDefinitions)
- MultiThreaded
+ MultiThreadedDLL
4996
@@ -132,7 +132,7 @@
true
true
WIN32;%(PreprocessorDefinitions)
- MultiThreaded
+ MultiThreadedDLL
4996
diff --git a/msvs/lua/lua/lua.vcxproj b/msvs/lua/lua/lua.vcxproj
index 558c5f6ae17a77fd362362be591a32442cf39630..8546d768de3c6c8208b5a0502caff8fa9f3575cd 100644
--- a/msvs/lua/lua/lua.vcxproj
+++ b/msvs/lua/lua/lua.vcxproj
@@ -91,7 +91,7 @@
Disabled
WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
NotUsing
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4244;4018
@@ -106,7 +106,7 @@
Disabled
WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
NotUsing
- MultiThreadedDebug
+ MultiThreadedDebugDLL
4244;4018
@@ -120,7 +120,7 @@
Level3
WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
NotUsing
- MultiThreaded
+ MultiThreadedDLL
4244;4018
@@ -134,7 +134,7 @@
Level3
WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
NotUsing
- MultiThreaded
+ MultiThreadedDLL
4244;4018
diff --git a/src/ae_wsiocp.c b/src/ae_wsiocp.c
index 6fde0eb8f37f004aec67884f19b9991746ae468e..4749fef9c374dc3394ce85b8e0e266b7275a2f2d 100644
--- a/src/ae_wsiocp.c
+++ b/src/ae_wsiocp.c
@@ -53,8 +53,7 @@ sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx;
* socket value is not an index. Convert socket to index
* and then find matching structure in list */
-/* prefer prime number for number of indexes */
-#define MAX_SOCKET_LOOKUP 1021
+#define MAX_SOCKET_LOOKUP 65535
/* structure that keeps state of sockets and Completion port handle */
typedef struct aeApiState {
@@ -65,10 +64,9 @@ typedef struct aeApiState {
list closing;
} aeApiState;
-/* convert socket value to an index
- * Use simple modulo. We can add hash if needed */
+/* uses virtual FD as an index */
int aeSocketIndex(int fd) {
- return fd % MAX_SOCKET_LOOKUP;
+ return smLookupFD( fd );
}
/* get data for socket / fd being monitored. Create if not found*/
diff --git a/src/rdb.c b/src/rdb.c
index afbb80135b66e5792f5c95a8aee8c8e9cb3ec3f9..da6894b7ecac9901925d93666ab8626c21ead112 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -39,6 +39,8 @@
#include
#include
#include
+#else
+#include
#endif
#include
@@ -414,6 +416,11 @@ int rdbSaveDoubleValue(rio *rdb, double val) {
int rdbLoadDoubleValue(rio *rdb, double *val) {
char buf[128];
unsigned char len;
+#ifdef _WIN32
+ double scannedVal = 0;
+ int assigned = 0;
+ memset(buf, 128, 0);
+#endif
if (rioRead(rdb,&len,1) == 0) return -1;
switch(len) {
@@ -423,8 +430,18 @@ int rdbLoadDoubleValue(rio *rdb, double *val) {
default:
if (rioRead(rdb,buf,len) == 0) return -1;
buf[len] = '\0';
+#ifdef _WIN32
+ assigned = sscanf_s(buf, "%lg", &scannedVal);
+ if( assigned != 0 ) {
+ (*val) = scannedVal;
+ return 0;
+ } else {
+ return -1;
+ }
+#else
sscanf(buf, "%lg", val);
return 0;
+#endif
}
}
@@ -1338,13 +1355,15 @@ void stopLoading(void) {
}
int rdbLoad(char *filename) {
- uint32_t dbid;
- int type, rdbver;
+ uint32_t dbid = 0;
+ int type = 0;
+ int rdbver = 0;
redisDb *db = server.db+0;
char buf[1024];
- long long expiretime, now = mstime();
+ long long expiretime;
+ long now = mstime();
long loops = 0;
- FILE *fp;
+ FILE *fp = NULL;
rio rdb;
#ifdef _WIN32
diff --git a/src/sentinel.c b/src/sentinel.c
index e854392168b83ffbebf5887c5e6f458990c3cb7e..12dc879073f7a2bc81715ffccca285bf42370cef 100644
--- a/src/sentinel.c
+++ b/src/sentinel.c
@@ -39,7 +39,9 @@
#include
#endif
+#ifndef _WIN32
extern char **environ;
+#endif
#define REDIS_SENTINEL_PORT 26379
@@ -671,7 +673,11 @@ void sentinelRunPendingScripts(void) {
sj->pid = 0;
} else if (pid == 0) {
/* Child */
+#ifdef _WIN32
+ _execv(sj->argv[0],sj->argv);
+#else
execve(sj->argv[0],sj->argv,environ);
+#endif
/* If we are here an error occurred. */
_exit(2); /* Don't retry execution. */
} else {
diff --git a/src/win32_wsiocp.c b/src/win32_wsiocp.c
index 4f7468d72e3166be1887b5e7c73fad874ce82f5c..4cf466df028d0cd354e40f3af7c54d726c843621 100644
--- a/src/win32_wsiocp.c
+++ b/src/win32_wsiocp.c
@@ -442,6 +442,7 @@ void aeShutdown(int fd) {
/* when closing socket, need to unassociate completion port */
int aeWinCloseSocket(int fd) {
aeSockState *sockstate;
+ BOOL closed = FALSE;
if ((sockstate = aeGetSockState(iocpState, fd)) == NULL) {
closesocket((SOCKET)fd);
@@ -455,12 +456,14 @@ int aeWinCloseSocket(int fd) {
if (sockstate->wreqs == 0 &&
(sockstate->masks & (READ_QUEUED | CONNECT_PENDING | SOCKET_ATTACHED)) == 0) {
closesocket((SOCKET)fd);
- smRemoveSocket(fd);
+ closed = TRUE;
} else {
sockstate->masks |= CLOSE_PENDING;
}
aeDelSockState(iocpState, sockstate);
+ if (closed == TRUE) smRemoveSocket(fd);
+
return 0;
}