diff --git a/deps/hiredis/async.c b/deps/hiredis/async.c
index b95b86fa..4bdfd384 100644
--- a/deps/hiredis/async.c
+++ b/deps/hiredis/async.c
@@ -156,9 +156,9 @@ redisAsyncContext *redisAsyncConnect(const char *ip, int port) {
struct sockaddr_in sa;
redisContext *c = redisPreConnectNonBlock(ip, port, &sa);
redisAsyncContext *ac = redisAsyncInitialize(c);
- if (aeWinSocketConnect(c->fd, (struct sockaddr *)&sa, sizeof(sa)) != 0) {
- c->err = errno;
- strerror_r(errno,c->errstr,sizeof(c->errstr));
+ if (aeWinSocketConnect(ac->c.fd, (struct sockaddr *)&sa, sizeof(sa)) != 0) {
+ ac->c.err = errno;
+ strerror_r(errno,ac->c.errstr,sizeof(ac->c.errstr));
}
__redisAsyncCopyError(ac);
return ac;
diff --git a/msvs/RedisCheckAof/RedisCheckAof.vcxproj b/msvs/RedisCheckAof/RedisCheckAof.vcxproj
index 1b35edc3..3ecfd947 100644
--- a/msvs/RedisCheckAof/RedisCheckAof.vcxproj
+++ b/msvs/RedisCheckAof/RedisCheckAof.vcxproj
@@ -57,7 +57,7 @@
true
$(OutDir)redis-check-aof$(TargetExt)
- ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
false
MSVCRT
UseLinkTimeCodeGeneration
@@ -79,7 +79,7 @@
true
true
$(OutDir)redis-check-aof$(TargetExt)
- ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
false
diff --git a/msvs/RedisCli/RedisCli.vcxproj b/msvs/RedisCli/RedisCli.vcxproj
index f7c52bab..76a297d7 100644
--- a/msvs/RedisCli/RedisCli.vcxproj
+++ b/msvs/RedisCli/RedisCli.vcxproj
@@ -58,7 +58,7 @@
true
$(OutDir)redis-cli$(TargetExt)
$(OutDir);$(OutDir)lib
- hiredis.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
false
MSVCRT
UseLinkTimeCodeGeneration
@@ -81,7 +81,7 @@
true
$(OutDir)redis-cli$(TargetExt)
$(OutDir);$(OutDir)lib
- hiredis.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
false
@@ -103,6 +103,9 @@
{8c07f811-c81c-432c-b334-1ae6faecf951}
+
+ {13e85053-54b3-487b-8ddb-3430b1c1b3bf}
+
diff --git a/msvs/RedisServer.vcxproj b/msvs/RedisServer.vcxproj
index bd0f9c13..89eb0117 100644
--- a/msvs/RedisServer.vcxproj
+++ b/msvs/RedisServer.vcxproj
@@ -60,7 +60,7 @@
true
Console
$(OutDir);$(OutDir)lib
- lua.lib;hiredis.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies)
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies)
false
UseLinkTimeCodeGeneration
MSVCRT.lib
@@ -82,7 +82,7 @@
true
true
$(OutDir);$(OutDir)lib
- lua.lib;hiredis.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies)
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies)
false
UseLinkTimeCodeGeneration
@@ -170,6 +170,12 @@
{8c07f811-c81c-432c-b334-1ae6faecf951}
+
+ {13e85053-54b3-487b-8ddb-3430b1c1b3bf}
+
+
+ {170b0909-5f75-467f-9501-c99dec16c6dc}
+
diff --git a/src/RedisLog.c b/src/RedisLog.c
index 3f54f0b4..f3c04daf 100644
--- a/src/RedisLog.c
+++ b/src/RedisLog.c
@@ -45,7 +45,7 @@ void setLogFile(const char* logFileName)
free((void*)logFile);
logFile = NULL;
}
- logFile = (char*)malloc(strlen(logFile));
+ logFile = (char*)malloc(strlen(logFileName));
if (logFile==NULL) {
redisLog(REDIS_WARNING, "memory allocation failure");
return;
diff --git a/src/Win32_Interop/Win32_QFork.cpp b/src/Win32_Interop/Win32_QFork.cpp
index 6b3cc8fb..d4b57c4b 100644
--- a/src/Win32_Interop/Win32_QFork.cpp
+++ b/src/Win32_Interop/Win32_QFork.cpp
@@ -257,6 +257,7 @@ BOOL QForkMasterInit() {
0, sizeof(QForkControl),
NULL);
if (g_hQForkControlFileMap == NULL) {
+ printf( "Problem with CreateFileMapping\n");
errno = EBADF;
goto err;
}
@@ -267,6 +268,7 @@ BOOL QForkMasterInit() {
0, 0,
0);
if (g_pQForkControl == NULL) {
+ printf( "Problem with MapViewOfFile\n");
errno = ENOMEM;
goto err;
}
@@ -274,6 +276,7 @@ BOOL QForkMasterInit() {
// This must be called only once per process! Calling it more times than that will not recreate existing
// section, and dlmalloc will ultimately fail with an access violation. Once is good.
if (dlmallopt(M_GRANULARITY, cAllocationGranularity) == 0) {
+ printf( "DLMalloc failed initializing allocation granularity.\n");
errno = ENOMEM;
goto err;
}
@@ -286,6 +289,7 @@ BOOL QForkMasterInit() {
SIZE_T maxPhysicalMapping = ms.ullTotalPhys - cSystemReserve;
g_pQForkControl->availableBlocksInHeap = (int)(maxPhysicalMapping / cAllocationGranularity);
if (g_pQForkControl->availableBlocksInHeap <= 0) {
+ printf( "Not enough physical memory to initialize Redis. Physical memory must be greater than 3GB.\n");
errno = ENOMEM;
goto err;
}
@@ -308,6 +312,7 @@ BOOL QForkMasterInit() {
FILE_ATTRIBUTE_NORMAL| FILE_FLAG_DELETE_ON_CLOSE,
NULL );
if (g_pQForkControl->heapMemoryMapFile == INVALID_HANDLE_VALUE) {
+ printf( "Problem creating memory mapped file.\n");
errno = EBADF;
goto err;
}
@@ -322,6 +327,7 @@ BOOL QForkMasterInit() {
LODWORD(mmSize),
NULL);
if (g_pQForkControl->heapMemoryMap == NULL) {
+ printf( "Problem mapping heap.\n");
errno = EBADF;
goto err;
}
@@ -336,6 +342,7 @@ BOOL QForkMasterInit() {
MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN,
PAGE_READWRITE);
if (pHigh == NULL) {
+ printf( "Viirtual memory reservation failed.\n");
DWORD err = GetLastError();
errno = ENOMEM;
goto err;
@@ -354,6 +361,7 @@ BOOL QForkMasterInit() {
0,
pHigh);
if (g_pQForkControl->heapStart == NULL) {
+ printf( "Mapping view of heap failed.\n");
DWORD err = GetLastError();
errno = ENOMEM;
goto err;
@@ -395,6 +403,12 @@ BOOL QForkMasterInit() {
return TRUE;
err:
+ printf( "Error ocurred initializing Redis.");
+ if( GetLastError() != 0 ) {
+ printf( " GetLastError() returns 0x%08x", GetLastError());
+ }
+ printf( "\n");
+
return FALSE;
}
diff --git a/src/Win32_Interop/win32fixes.c b/src/Win32_Interop/win32fixes.c
index 0afc27e2..48c2c7d1 100644
--- a/src/Win32_Interop/win32fixes.c
+++ b/src/Win32_Interop/win32fixes.c
@@ -84,6 +84,24 @@ pid_t wait3(int *stat_loc, int options, void *rusage) {
REDIS_NOTUSED(stat_loc);
REDIS_NOTUSED(options);
REDIS_NOTUSED(rusage);
+//JEP: BUGBUG
+// http://linux.die.net/man/2/wait3 says:
+// "wait3(status, options, rusage); is equivalent to: waitpid(-1, status, options); "
+//
+// http://linux.die.net/man/2/waitpid says:
+// "The value of pid can be:
+// < -1 meaning wait for any child process whose process group ID is equal to the absolute value of pid.
+// -1 meaning wait for any child process.
+// 0 meaning wait for any child process whose process group ID is equal to that of the calling process.
+// > 0 meaning wait for the child whose process ID is equal to the value of pid."
+//
+// On Windows waitpid evaluates to _cwait, so the -1 passed referrs to the current process. Thus it will never signal.
+//
+// Since windows parent->child relationships are unreliable (process ids are recycled leading to unexpected PID relationships),
+// the hiredis mechanism of process signaling will have to be changed. It should be using process handles on Windows.
+
+
+
return (pid_t) waitpid((intptr_t) -1, 0, WAIT_FLAGS);
}
diff --git a/src/config.c b/src/config.c
index 1ebcbbf2..bff3dcfb 100644
--- a/src/config.c
+++ b/src/config.c
@@ -173,6 +173,9 @@ void loadServerConfigFromString(char *config) {
err = "Invalid log level. Must be one of debug, notice, warning";
goto loaderr;
}
+#ifdef _WIN32
+ setLogVerbosityLevel(server.verbosity);
+#endif
} else if (!strcasecmp(argv[0],"logfile") && argc == 2) {
FILE *logfp;