Changed wait_process and wait_debug_event requests to never block;
waiting is always done through WaitForSingleObject().
diff --git a/dlls/kernel/debugger.c b/dlls/kernel/debugger.c
index 6dc274a..0db2981 100644
--- a/dlls/kernel/debugger.c
+++ b/dlls/kernel/debugger.c
@@ -31,82 +31,92 @@
DWORD timeout /* Number of milliseconds to wait for event. */)
{
BOOL ret;
- SERVER_START_REQ
+ DWORD res;
+
+ for (;;)
{
- debug_event_t *data;
- struct wait_debug_event_request *req = server_alloc_req( sizeof(*req), sizeof(*data) );
-
- req->timeout = timeout;
- if (!(ret = !server_call( REQ_WAIT_DEBUG_EVENT ))) goto done;
-
- if (!server_data_size(req)) /* timeout */
+ HANDLE wait = 0;
+ SERVER_START_REQ
{
- SetLastError( ERROR_SEM_TIMEOUT );
- ret = FALSE;
- goto done;
+ debug_event_t *data;
+ struct wait_debug_event_request *req = server_alloc_req( sizeof(*req), sizeof(*data) );
+
+ req->get_handle = (timeout != 0);
+ if (!(ret = !server_call( REQ_WAIT_DEBUG_EVENT ))) goto done;
+
+ if (!server_data_size(req)) /* timeout */
+ {
+ wait = req->wait;
+ ret = FALSE;
+ goto done;
+ }
+ data = server_data_ptr(req);
+ event->dwDebugEventCode = data->code;
+ event->dwProcessId = (DWORD)req->pid;
+ event->dwThreadId = (DWORD)req->tid;
+ switch(data->code)
+ {
+ case EXCEPTION_DEBUG_EVENT:
+ event->u.Exception.ExceptionRecord = data->info.exception.record;
+ event->u.Exception.dwFirstChance = data->info.exception.first;
+ break;
+ case CREATE_THREAD_DEBUG_EVENT:
+ event->u.CreateThread.hThread = data->info.create_thread.handle;
+ event->u.CreateThread.lpThreadLocalBase = data->info.create_thread.teb;
+ event->u.CreateThread.lpStartAddress = data->info.create_thread.start;
+ break;
+ case CREATE_PROCESS_DEBUG_EVENT:
+ event->u.CreateProcessInfo.hFile = data->info.create_process.file;
+ event->u.CreateProcessInfo.hProcess = data->info.create_process.process;
+ event->u.CreateProcessInfo.hThread = data->info.create_process.thread;
+ event->u.CreateProcessInfo.lpBaseOfImage = data->info.create_process.base;
+ event->u.CreateProcessInfo.dwDebugInfoFileOffset = data->info.create_process.dbg_offset;
+ event->u.CreateProcessInfo.nDebugInfoSize = data->info.create_process.dbg_size;
+ event->u.CreateProcessInfo.lpThreadLocalBase = data->info.create_process.teb;
+ event->u.CreateProcessInfo.lpStartAddress = data->info.create_process.start;
+ event->u.CreateProcessInfo.lpImageName = data->info.create_process.name;
+ event->u.CreateProcessInfo.fUnicode = data->info.create_process.unicode;
+ if (data->info.create_process.file == -1) event->u.CreateProcessInfo.hFile = 0;
+ break;
+ case EXIT_THREAD_DEBUG_EVENT:
+ event->u.ExitThread.dwExitCode = data->info.exit.exit_code;
+ break;
+ case EXIT_PROCESS_DEBUG_EVENT:
+ event->u.ExitProcess.dwExitCode = data->info.exit.exit_code;
+ break;
+ case LOAD_DLL_DEBUG_EVENT:
+ event->u.LoadDll.hFile = data->info.load_dll.handle;
+ event->u.LoadDll.lpBaseOfDll = data->info.load_dll.base;
+ event->u.LoadDll.dwDebugInfoFileOffset = data->info.load_dll.dbg_offset;
+ event->u.LoadDll.nDebugInfoSize = data->info.load_dll.dbg_size;
+ event->u.LoadDll.lpImageName = data->info.load_dll.name;
+ event->u.LoadDll.fUnicode = data->info.load_dll.unicode;
+ if (data->info.load_dll.handle == -1) event->u.LoadDll.hFile = 0;
+ break;
+ case UNLOAD_DLL_DEBUG_EVENT:
+ event->u.UnloadDll.lpBaseOfDll = data->info.unload_dll.base;
+ break;
+ case OUTPUT_DEBUG_STRING_EVENT:
+ event->u.DebugString.lpDebugStringData = data->info.output_string.string;
+ event->u.DebugString.fUnicode = data->info.output_string.unicode;
+ event->u.DebugString.nDebugStringLength = data->info.output_string.length;
+ break;
+ case RIP_EVENT:
+ event->u.RipInfo.dwError = data->info.rip_info.error;
+ event->u.RipInfo.dwType = data->info.rip_info.type;
+ break;
+ }
+ done:
}
- data = server_data_ptr(req);
- event->dwDebugEventCode = data->code;
- event->dwProcessId = (DWORD)req->pid;
- event->dwThreadId = (DWORD)req->tid;
- switch(data->code)
- {
- case EXCEPTION_DEBUG_EVENT:
- event->u.Exception.ExceptionRecord = data->info.exception.record;
- event->u.Exception.dwFirstChance = data->info.exception.first;
- break;
- case CREATE_THREAD_DEBUG_EVENT:
- event->u.CreateThread.hThread = data->info.create_thread.handle;
- event->u.CreateThread.lpThreadLocalBase = data->info.create_thread.teb;
- event->u.CreateThread.lpStartAddress = data->info.create_thread.start;
- break;
- case CREATE_PROCESS_DEBUG_EVENT:
- event->u.CreateProcessInfo.hFile = data->info.create_process.file;
- event->u.CreateProcessInfo.hProcess = data->info.create_process.process;
- event->u.CreateProcessInfo.hThread = data->info.create_process.thread;
- event->u.CreateProcessInfo.lpBaseOfImage = data->info.create_process.base;
- event->u.CreateProcessInfo.dwDebugInfoFileOffset = data->info.create_process.dbg_offset;
- event->u.CreateProcessInfo.nDebugInfoSize = data->info.create_process.dbg_size;
- event->u.CreateProcessInfo.lpThreadLocalBase = data->info.create_process.teb;
- event->u.CreateProcessInfo.lpStartAddress = data->info.create_process.start;
- event->u.CreateProcessInfo.lpImageName = data->info.create_process.name;
- event->u.CreateProcessInfo.fUnicode = data->info.create_process.unicode;
- if (data->info.create_process.file == -1) event->u.CreateProcessInfo.hFile = 0;
- break;
- case EXIT_THREAD_DEBUG_EVENT:
- event->u.ExitThread.dwExitCode = data->info.exit.exit_code;
- break;
- case EXIT_PROCESS_DEBUG_EVENT:
- event->u.ExitProcess.dwExitCode = data->info.exit.exit_code;
- break;
- case LOAD_DLL_DEBUG_EVENT:
- event->u.LoadDll.hFile = data->info.load_dll.handle;
- event->u.LoadDll.lpBaseOfDll = data->info.load_dll.base;
- event->u.LoadDll.dwDebugInfoFileOffset = data->info.load_dll.dbg_offset;
- event->u.LoadDll.nDebugInfoSize = data->info.load_dll.dbg_size;
- event->u.LoadDll.lpImageName = data->info.load_dll.name;
- event->u.LoadDll.fUnicode = data->info.load_dll.unicode;
- if (data->info.load_dll.handle == -1) event->u.LoadDll.hFile = 0;
- break;
- case UNLOAD_DLL_DEBUG_EVENT:
- event->u.UnloadDll.lpBaseOfDll = data->info.unload_dll.base;
- break;
- case OUTPUT_DEBUG_STRING_EVENT:
- event->u.DebugString.lpDebugStringData = data->info.output_string.string;
- event->u.DebugString.fUnicode = data->info.output_string.unicode;
- event->u.DebugString.nDebugStringLength = data->info.output_string.length;
- break;
- case RIP_EVENT:
- event->u.RipInfo.dwError = data->info.rip_info.error;
- event->u.RipInfo.dwType = data->info.rip_info.type;
- break;
- default:
- server_protocol_error( "WaitForDebugEvent: bad code %d\n", data->code );
- }
- done:
+ SERVER_END_REQ;
+ if (ret) return TRUE;
+ if (!wait) break;
+ res = WaitForSingleObject( wait, timeout );
+ CloseHandle( wait );
+ if (res != STATUS_WAIT_0) break;
}
- SERVER_END_REQ;
- return ret;
+ SetLastError( ERROR_SEM_TIMEOUT );
+ return FALSE;
}