From 5eb4db5e8fa197339fdd28f23f447da777623f2b Mon Sep 17 00:00:00 2001
From: Pierre Joye <pajoye@php.net>
Date: Mon, 25 Jan 2010 14:47:19 +0000
Subject: [PATCH] - Ensure that stderr output are not buffered, portability for
 tests

---
 Zend/zend_alloc.c       | 32 ++++++++++++++++++++++++++++++++
 Zend/zend_execute.c     |  4 ++++
 Zend/zend_execute_API.c |  4 ++++
 Zend/zend_extensions.c  | 24 ++++++++++++++++++++++++
 main/output.c           |  4 ++++
 5 files changed, 68 insertions(+)

diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index ed9aeb879b..8c7397a722 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -84,6 +84,10 @@ static void zend_mm_panic(const char *message) __attribute__ ((noreturn));
 static void zend_mm_panic(const char *message)
 {
 	fprintf(stderr, "%s\n", message);
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+	fflush(stderr);
+#endif
 #if ZEND_DEBUG && defined(HAVE_KILL) && defined(HAVE_GETPID)
 	kill(getpid(), SIGSEGV);
 #endif
@@ -1031,11 +1035,19 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_mem_handlers *handlers,
 
 	if (zend_mm_low_bit(block_size) != zend_mm_high_bit(block_size)) {
 		fprintf(stderr, "'block_size' must be a power of two\n");
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+		fflush(stderr);
+#endif
 		exit(255);
 	}
 	storage = handlers->init(params);
 	if (!storage) {
 		fprintf(stderr, "Cannot initialize zend_mm storage [%s]\n", handlers->name);
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+		fflush(stderr);
+#endif
 		exit(255);
 	}
 	storage->handlers = handlers;
@@ -1118,9 +1130,17 @@ ZEND_API zend_mm_heap *zend_mm_startup(void)
 		if (!mem_handlers[i].name) {
 			fprintf(stderr, "Wrong or unsupported zend_mm storage type '%s'\n", mem_type);
 			fprintf(stderr, "  supported types:\n");
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+			fflush(stderr);
+#endif
 			for (i = 0; mem_handlers[i].name; i++) {
 				fprintf(stderr, "    '%s'\n", mem_handlers[i].name);
 			}
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+			fflush(stderr);
+#endif
 			exit(255);
 		}
 	}
@@ -1131,9 +1151,17 @@ ZEND_API zend_mm_heap *zend_mm_startup(void)
 		seg_size = zend_atoi(tmp, 0);
 		if (zend_mm_low_bit(seg_size) != zend_mm_high_bit(seg_size)) {
 			fprintf(stderr, "ZEND_MM_SEG_SIZE must be a power of two\n");
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+			fflush(stderr);
+#endif
 			exit(255);
 		} else if (seg_size < ZEND_MM_ALIGNED_SEGMENT_SIZE + ZEND_MM_ALIGNED_HEADER_SIZE) {
 			fprintf(stderr, "ZEND_MM_SEG_SIZE is too small\n");
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+			fflush(stderr);
+#endif
 			exit(255);
 		}
 	} else {
@@ -1672,6 +1700,10 @@ static void zend_mm_safe_error(zend_mm_heap *heap,
 					size);
 				fprintf(stderr, " in %s on line %d\n", error_filename, error_lineno);
 			}
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+			fflush(stderr);
+#endif
 		} zend_end_try();
 	} else {
 		heap->overflow = 2;
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 983cb292bb..ae54c5fa1b 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1232,6 +1232,10 @@ static int zend_check_symbol(zval **pz TSRMLS_DC)
 {
 	if (Z_TYPE_PP(pz) > 9) {
 		fprintf(stderr, "Warning!  %x has invalid type!\n", *pz);
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+		fflush(stderr);
+#endif
 	} else if (Z_TYPE_PP(pz) == IS_ARRAY) {
 		zend_hash_apply(Z_ARRVAL_PP(pz), (apply_func_t) zend_check_symbol TSRMLS_CC);
 	} else if (Z_TYPE_PP(pz) == IS_OBJECT) {
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 4f2a6c66d9..f73df65e2a 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -74,6 +74,10 @@ static void zend_handle_sigsegv(int dummy) /* {{{ */
 				get_active_function_name(TSRMLS_C),
 				zend_get_executed_filename(TSRMLS_C),
 				zend_get_executed_lineno(TSRMLS_C));
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+		fflush(stderr);
+#endif
 	}
 	if (original_sigsegv_handler!=zend_handle_sigsegv) {
 		original_sigsegv_handler(dummy);
diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c
index 232239763c..f3e9c32e3b 100644
--- a/Zend/zend_extensions.c
+++ b/Zend/zend_extensions.c
@@ -35,6 +35,10 @@ int zend_load_extension(const char *path)
 	if (!handle) {
 #ifndef ZEND_WIN32
 		fprintf(stderr, "Failed loading %s:  %s\n", path, DL_ERROR());
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+		fflush(stderr);
+#endif
 #else
 		fprintf(stderr, "Failed loading %s\n", path);
 #endif
@@ -51,6 +55,10 @@ int zend_load_extension(const char *path)
 	}
 	if (!extension_version_info || !new_extension) {
 		fprintf(stderr, "%s doesn't appear to be a valid Zend extension\n", path);
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+		fflush(stderr);
+#endif
 		DL_UNLOAD(handle);
 		return FAILURE;
 	}
@@ -64,6 +72,10 @@ int zend_load_extension(const char *path)
 					new_extension->name,
 					extension_version_info->zend_extension_api_no,
 					ZEND_EXTENSION_API_NO);
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+			fflush(stderr);
+#endif
 			DL_UNLOAD(handle);
 			return FAILURE;
 		} else if (extension_version_info->zend_extension_api_no < ZEND_EXTENSION_API_NO) {
@@ -76,6 +88,10 @@ int zend_load_extension(const char *path)
 					new_extension->author,
 					new_extension->URL,
 					new_extension->name);
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+			fflush(stderr);
+#endif
 			DL_UNLOAD(handle);
 			return FAILURE;
 		}
@@ -83,6 +99,10 @@ int zend_load_extension(const char *path)
 	           (!new_extension->build_id_check || new_extension->build_id_check(ZEND_EXTENSION_BUILD_ID) != SUCCESS)) {
 		fprintf(stderr, "Cannot load %s - it was built with configuration %s, whereas running engine is %s\n",
 					new_extension->name, extension_version_info->build_id, ZEND_EXTENSION_BUILD_ID);
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+		fflush(stderr);
+#endif
 		DL_UNLOAD(handle);
 		return FAILURE;
 	}
@@ -90,6 +110,10 @@ int zend_load_extension(const char *path)
 	return zend_register_extension(new_extension, handle);
 #else
 	fprintf(stderr, "Extensions are not supported on this platform.\n");
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+	fflush(stderr);
+#endif
 	return FAILURE;
 #endif
 }
diff --git a/main/output.c b/main/output.c
index 302bb9993c..bee6ef8aa8 100644
--- a/main/output.c
+++ b/main/output.c
@@ -50,6 +50,10 @@ php_output_globals output_globals;
 PHPAPI int php_default_output_func(const char *str, uint str_len TSRMLS_DC)
 {
 	fwrite(str, 1, str_len, stderr);
+/* See http://support.microsoft.com/kb/190351 */
+#ifdef PHP_WIN32
+	fflush(stderr);
+#endif
 	return str_len;
 }
 /* }}} */
-- 
2.40.0