summaryrefslogtreecommitdiff
path: root/Zend/zend_alloc.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-09-16 12:27:25 +0200
committerAnatol Belski <ab@php.net>2014-09-16 12:27:25 +0200
commit3329d54cd918d6101a663055eed72cb79bfb0c02 (patch)
tree168946b5ff4e6dc1d864ffd1a22cd0caba2adfa8 /Zend/zend_alloc.c
parent13be4a5a4bca457512eadbb1c351597dd88f3031 (diff)
downloadphp-git-3329d54cd918d6101a663055eed72cb79bfb0c02.tar.gz
better error messages in ZMM on Windows
Diffstat (limited to 'Zend/zend_alloc.c')
-rw-r--r--Zend/zend_alloc.c32
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;