subprocess: Proper implementation of wait() on Windows
This commit makes sure: 1. WaitForSingleObject returns with expected code before proceeding. 2. Process handle is properly closed. Github-Pull: arun11299/cpp-subprocess#116 Rebased-From: 625a8775791e62736f20f3fa3e6cc4f1b24aa89a
This commit is contained in:
1 parent
7423214d8d
commit
b7288decdf
1 file changed
+7
@@ -1061,11 +1061,18 @@ inline int Popen::wait() noexcept(false)
|
|||||||
#ifdef __USING_WINDOWS__
|
#ifdef __USING_WINDOWS__
|
||||||
int ret = WaitForSingleObject(process_handle_, INFINITE);
|
int ret = WaitForSingleObject(process_handle_, INFINITE);
|
||||||
|
|
||||||
|
// WaitForSingleObject with INFINITE should only return when process has signaled
|
||||||
|
if (ret != WAIT_OBJECT_0) {
|
||||||
|
throw OSError("Unexpected return code from WaitForSingleObject", 0);
|
||||||
|
}
|
||||||
|
|
||||||
DWORD dretcode_;
|
DWORD dretcode_;
|
||||||
|
|
||||||
if (FALSE == GetExitCodeProcess(process_handle_, &dretcode_))
|
if (FALSE == GetExitCodeProcess(process_handle_, &dretcode_))
|
||||||
throw OSError("Failed during call to GetExitCodeProcess", 0);
|
throw OSError("Failed during call to GetExitCodeProcess", 0);
|
||||||
|
|
||||||
|
CloseHandle(process_handle_);
|
||||||
|
|
||||||
return (int)dretcode_;
|
return (int)dretcode_;
|
||||||
#else
|
#else
|
||||||
int ret, status;
|
int ret, status;
|
||||||
|
|||||||
Reference in new issue
Block a user