changeset 888:a995eae8e75c

blind: partial merger of Stewart's crashRun for Windows Stewart Gordon <smjg_1998@yahoo.com> 2005-12-06 news:dn3r9u$kfo$1@digitaldaemon.com
author thomask
date Sun, 05 Mar 2006 21:57:33 +0000
parents c1c995d2ea6f
children b3da1b510a19
files dstress.c
diffstat 1 files changed, 78 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/dstress.c	Sun Mar 05 07:18:39 2006 +0000
+++ b/dstress.c	Sun Mar 05 21:57:33 2006 +0000
@@ -61,7 +61,7 @@
 #define USE_POSIX 1
 #endif
 
-#if defined(WIN) || defined(WIN32)
+#if defined(WIN) || defined(WIN32) || defined(WIN64)
 #define USE_WINDOWS 1
 #endif
 
@@ -122,13 +122,16 @@
 #define		TMP_DIR		"./obj"
 #else
 #ifdef USE_WINDOWS
-#define		CRASH_RUN	".\\crashRun"
 #define		TMP_DIR		".\\obj"
 #else
 #error OS dependent file names not defined
 #endif
 #endif
 
+#ifdef USE_WINDOWS
+HANDLE originalStdout, originalStderr;
+#endif
+
 const char* torture[] = {
 	"",
 
@@ -633,8 +636,76 @@
 	}else{
 		return RAND_MAX;
 	}
-#else
+#elif defined USE_WINDOWS
+	PROCESS_INFORMATION processInfo;
+	STARTUPINFO startupInfo;
+	SECURITY_ATTRIBUTES sa = {
+		sizeof(SECURITY_ATTRIBUTES), NULL, TRUE
+	};
+	HANDLE tLogFile;
+	unsigned long exitCode;
+	int timeLeft = 600;	// time limit in iterations of WFX loop
+
+	memset(&processInfo, 0, sizeof(PROCESS_INFORMATION));
+	memset(&startupInfo, 0, sizeof(STARTUPINFO));
+	startupInfo.cb = sizeof(STARTUPINFO);
+
+	tLogFile = CreateFile(*logFile, GENERIC_WRITE,
+	  0, &sa, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);
+
+	if (tLogFile == NULL) {
+		printf("ERROR: could not open log file");
+		return RAND_MAX;
+	}
+
+	SetStdHandle(STD_OUTPUT_HANDLE, tLogFile);
+	SetStdHandle(STD_ERROR_HANDLE, originalStdout);
+
+	if (!CreateProcess(NULL, (char*) cmd, NULL, NULL, TRUE, 0, NULL, NULL,
+		  &startupInfo, &processInfo)) {
+		void *message;
+
+		FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
+		  | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), 0,
+		   (char*) &message, 0, NULL);
 
+		SetStdHandle(STD_OUTPUT_HANDLE, originalStdout);
+		SetStdHandle(STD_ERROR_HANDLE, originalStderr);
+		CloseHandle(tLogFile);
+
+		// this should never happen
+		fprintf(stderr, "ERROR running %s:\n", cmd);
+		fprintf(stderr, "%s\n", message);
+		LocalFree((HLOCAL) message);
+		return RAND_MAX;
+	}
+
+	// wait for exit
+	while (TRUE) {
+		GetExitCodeProcess(processInfo.hProcess, &exitCode);
+		if (exitCode == 0x103) {
+			if (--timeLeft == 0) {
+				TerminateProcess(processInfo.hProcess, EXIT_FAILURE);
+				SetStdHandle(STD_OUTPUT_HANDLE, originalStdout);
+				SetStdHandle(STD_ERROR_HANDLE, originalStderr);
+				CloseHandle(tLogFile);
+				printf("EXIT CODE: timeout\n");
+				Sleep(100);
+				return RAND_MAX;
+			}
+			Sleep(100);
+		} else {
+			SetStdHandle(STD_OUTPUT_HANDLE, originalStdout);
+			SetStdHandle(STD_ERROR_HANDLE, originalStderr);
+
+			CloseHandle(tLogFile);
+
+			printf("EXIT CODE: %i\n", exitCode);
+			return exitCode;
+		}
+	}
+
+#else /* USE_WINDOWS */
 #error comment me out, if your test cases produce neither eternal loops nor Access Violations
 
 	len = 10 + strlen(cmd) + strlen(*logFile);
@@ -646,7 +717,6 @@
 	fprintf(stderr, "EXIT CODE: %i\n", i);
 
 	return i;
-
 #endif /* USE_POSIX else */
 }
 
@@ -1078,6 +1148,10 @@
 
 
 	/* let's get serious */
+#ifdef USE_WINDOWS
+		originalStdout = GetStdHandle(STD_OUTPUT_HANDLE);
+		originalStderr = GetStdHandle(STD_ERROR_HANDLE);
+#endif
 
 	if(modus & MODE_TORTURE){
 		if((modus & (MODE_COMPILE | MODE_NOCOMPILE))