diff options
author | Anatol Belski <ab@php.net> | 2014-09-16 12:27:25 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2014-09-16 12:27:25 +0200 |
commit | 3329d54cd918d6101a663055eed72cb79bfb0c02 (patch) | |
tree | 168946b5ff4e6dc1d864ffd1a22cd0caba2adfa8 /Zend/zend_alloc.c | |
parent | 13be4a5a4bca457512eadbb1c351597dd88f3031 (diff) | |
download | php-git-3329d54cd918d6101a663055eed72cb79bfb0c02.tar.gz |
better error messages in ZMM on Windows
Diffstat (limited to 'Zend/zend_alloc.c')
-rw-r--r-- | Zend/zend_alloc.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index f35837b77c..8b6a105e98 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -372,6 +372,30 @@ static ZEND_NORETURN void zend_mm_safe_error(zend_mm_heap *heap, exit(1); } +#ifdef _WIN32 +void +stderr_last_error(char *msg) +{ + LPSTR buf = NULL; + DWORD err = GetLastError(); + + if (!FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&buf, + 0, NULL)) { + fprintf(stderr, "\n%s: [0x%08x]\n", msg, err); + } + else { + fprintf(stderr, "\n%s: [0x%08x] %s\n", msg, err, buf); + } +} +#endif + /*****************/ /* OS Allocation */ /*****************/ @@ -408,7 +432,7 @@ static void *zend_mm_mmap(size_t size) if (ptr == NULL) { #if ZEND_MM_ERROR - fprintf(stderr, "\nVirtualAlloc() failed: [%d]\n", GetLastError()); + stderr_last_error("VirtualAlloc() failed"); #endif return NULL; } @@ -431,7 +455,7 @@ static void zend_mm_munmap(void *addr, size_t size) #ifdef _WIN32 if (VirtualFree(addr, 0, MEM_RELEASE) == 0) { #if ZEND_MM_ERROR - fprintf(stderr, "\nVirtualFree() failed: [%d]\n", GetLastError()); + stderr_last_error("VirtualFree() failed"); #endif } #else @@ -1611,8 +1635,12 @@ zend_mm_heap *zend_mm_init(void) if (UNEXPECTED(chunk == NULL)) { #if ZEND_MM_ERROR +#ifdef _WIN32 + stderr_last_error("Can't initialize heap"); +#else fprintf(stderr, "\nCan't initialize heap: [%d] %s\n", errno, strerror(errno)); #endif +#endif return NULL; } heap = &chunk->heap_slot; |