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;