Alexandre Julliard : winetest: Process messages while waiting for a process to terminate.
Alexandre Julliard
julliard at winehq.org
Mon Feb 23 10:00:33 CST 2009
Module: wine
Branch: master
Commit: d9d2f37162179be7dc8c073094d6522149504e15
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d9d2f37162179be7dc8c073094d6522149504e15
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Feb 23 12:22:24 2009 +0100
winetest: Process messages while waiting for a process to terminate.
---
programs/winetest/main.c | 93 +++++++++++++++++++++++++--------------------
1 files changed, 52 insertions(+), 41 deletions(-)
diff --git a/programs/winetest/main.c b/programs/winetest/main.c
index e53502d..0ab512a 100644
--- a/programs/winetest/main.c
+++ b/programs/winetest/main.c
@@ -339,6 +339,21 @@ extract_test (struct wine_test *test, const char *dir, LPTSTR res_name)
CloseHandle(hfile);
}
+static DWORD wait_process( HANDLE process, DWORD timeout )
+{
+ DWORD wait, diff = 0, start = GetTickCount();
+ MSG msg;
+
+ while (diff < timeout)
+ {
+ wait = MsgWaitForMultipleObjects( 1, &process, FALSE, timeout - diff, QS_ALLINPUT );
+ if (wait != WAIT_OBJECT_0 + 1) return wait;
+ while (PeekMessageW( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg );
+ diff = GetTickCount() - start;
+ }
+ return WAIT_TIMEOUT;
+}
+
/* Run a command for MS milliseconds. If OUT != NULL, also redirect
stdout to there.
@@ -359,49 +374,45 @@ run_ex (char *cmd, HANDLE out_file, const char *tempdir, DWORD ms)
si.hStdError = out_file ? out_file : GetStdHandle( STD_ERROR_HANDLE );
if (!CreateProcessA (NULL, cmd, NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE,
- NULL, tempdir, &si, &pi)) {
- status = -2;
- } else {
- CloseHandle (pi.hThread);
- wait = WaitForSingleObject (pi.hProcess, ms);
- if (wait == WAIT_OBJECT_0) {
- GetExitCodeProcess (pi.hProcess, &status);
- } else {
- switch (wait) {
- case WAIT_FAILED:
- report (R_ERROR, "Wait for '%s' failed: %d", cmd,
- GetLastError ());
- break;
- case WAIT_TIMEOUT:
- report (R_ERROR, "Process '%s' timed out.", cmd);
- break;
- default:
- report (R_ERROR, "Wait returned %d", wait);
- }
- status = wait;
- if (!TerminateProcess (pi.hProcess, 257))
- report (R_ERROR, "TerminateProcess failed: %d",
- GetLastError ());
- wait = WaitForSingleObject (pi.hProcess, 5000);
- switch (wait) {
- case WAIT_FAILED:
- report (R_ERROR,
- "Wait for termination of '%s' failed: %d",
- cmd, GetLastError ());
- break;
- case WAIT_OBJECT_0:
- break;
- case WAIT_TIMEOUT:
- report (R_ERROR, "Can't kill process '%s'", cmd);
- break;
- default:
- report (R_ERROR, "Waiting for termination: %d",
- wait);
- }
- }
+ NULL, tempdir, &si, &pi))
+ return -2;
+
+ CloseHandle (pi.hThread);
+ status = wait_process( pi.hProcess, ms );
+ switch (status)
+ {
+ case WAIT_OBJECT_0:
+ GetExitCodeProcess (pi.hProcess, &status);
CloseHandle (pi.hProcess);
+ return status;
+ case WAIT_FAILED:
+ report (R_ERROR, "Wait for '%s' failed: %d", cmd, GetLastError ());
+ break;
+ case WAIT_TIMEOUT:
+ report (R_ERROR, "Process '%s' timed out.", cmd);
+ break;
+ default:
+ report (R_ERROR, "Wait returned %d", status);
+ break;
}
-
+ if (!TerminateProcess (pi.hProcess, 257))
+ report (R_ERROR, "TerminateProcess failed: %d", GetLastError ());
+ wait = wait_process( pi.hProcess, 5000 );
+ switch (wait)
+ {
+ case WAIT_OBJECT_0:
+ break;
+ case WAIT_FAILED:
+ report (R_ERROR, "Wait for termination of '%s' failed: %d", cmd, GetLastError ());
+ break;
+ case WAIT_TIMEOUT:
+ report (R_ERROR, "Can't kill process '%s'", cmd);
+ break;
+ default:
+ report (R_ERROR, "Waiting for termination: %d", wait);
+ break;
+ }
+ CloseHandle (pi.hProcess);
return status;
}
More information about the wine-cvs
mailing list