Hi all, Just going over win32-process, and I saw a few opportunities to refactor the kill method. In summary, signals 2 and 3 now raise an error if they fail, no handle is opened in the case of signals 2 and 3, and each of the kill approaches is now wrapped in a RUBY_CRITICAL section, which more closely mimics MRI. How does this patch look? Thanks, Dan >diff -u process.rb process.new --- process.rb Sat Aug 23 18:38:00 2008 +++ process.new Sat Aug 23 18:39:06 2008 @@ -155,71 +155,89 @@ pid = Process.pid end - # No need for full access if the signal is zero - if signal == 0 - access = PROCESS_QUERY_INFORMATION|PROCESS_VM_READ - handle = OpenProcess(access, 0 , pid) - else - handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid) - end - case signal when 0 - if handle != 0 - killed_pids.push(pid) - CloseHandle(handle) - else - # If ERROR_ACCESS_DENIED is returned, we know it''s running - if GetLastError() == ERROR_ACCESS_DENIED + RUBY_CRITICAL{ + access = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ + handle = OpenProcess(access, 0 , pid) + + if handle != 0 killed_pids.push(pid) + CloseHandle(handle) else - raise Error, get_last_error + # If ERROR_ACCESS_DENIED is returned, we know it''s running + if GetLastError() == ERROR_ACCESS_DENIED + killed_pids.push(pid) + else + raise Error, get_last_error + end end - end + } when 2 - if GenerateConsoleCtrlEvent(CTRL_C_EVENT, pid) - killed_pids.push(pid) - end + RUBY_CRITICAL{ + if GenerateConsoleCtrlEvent(CTRL_C_EVENT, pid) + killed_pids.push(pid) + else + raise Error, get_last_error + end + } when 3 - if GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid) - killed_pids.push(pid) - end + RUBY_CRITICAL{ + if GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid) + killed_pids.push(pid) + else + raise Error, get_last_error + end + } when 9 - if TerminateProcess(handle, pid) - CloseHandle(handle) - killed_pids.push(pid) - @child_pids.delete(pid) - else - raise Error, get_last_error - end + RUBY_CRITICAL{ + handle = OpenProcess(PROCESS_TERMINATE, 0, pid) + + if handle == 0 + raise Error, get_last_error + end + + if TerminateProcess(handle, pid) + CloseHandle(handle) + killed_pids.push(pid) + @child_pids.delete(pid) + else + raise Error, get_last_error + end + } else - if handle != 0 - thread_id = [0].pack(''L'') - dll = ''kernel32'' - eproc = ''ExitProcess'' + RUBY_CRITICAL{ + handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid) + + if handle != 0 + thread_id = [0].pack(''L'') + dll = ''kernel32'' + eproc = ''ExitProcess'' - thread = CreateRemoteThread( - handle, - 0, - 0, - GetProcAddress(GetModuleHandle(dll), eproc), - 0, - 0, - thread_id - ) + thread = CreateRemoteThread( + handle, + 0, + 0, + GetProcAddress(GetModuleHandle(dll), eproc), + 0, + 0, + thread_id + ) - if thread - WaitForSingleObject(thread, 5) - CloseHandle(handle) - killed_pids.push(pid) - @child_pids.delete(pid) + if thread + WaitForSingleObject(thread, 5) + CloseHandle(handle) + killed_pids.push(pid) + @child_pids.delete(pid) + else + CloseHandle(handle) + raise Error, get_last_error + end else - CloseHandle(handle) raise Error, get_last_error end - else - raise Error, get_last_error - end + } + @child_pids.delete(pid) end } @@ -613,8 +631,7 @@ begin unless Process32First(handle, proc_entry) - error = get_last_error - raise Error, error + raise Error, get_last_error end while Process32Next(handle, proc_entry) @@ -697,4 +714,4 @@ def fork(&block) Process.fork(&block) end