diff options
author | Bill Hoffman <bill.hoffman@kitware.com> | 2005-01-17 19:29:11 (GMT) |
---|---|---|
committer | Bill Hoffman <bill.hoffman@kitware.com> | 2005-01-17 19:29:11 (GMT) |
commit | e6e98b47da42835544fc817a44c43c9896994706 (patch) | |
tree | 6d0df0e96e897d5c93fa62d4eda10f4d978f25bb | |
parent | 5573da922f2354e6f8b098c04238b16a11cf9f03 (diff) | |
download | CMake-e6e98b47da42835544fc817a44c43c9896994706.zip CMake-e6e98b47da42835544fc817a44c43c9896994706.tar.gz CMake-e6e98b47da42835544fc817a44c43c9896994706.tar.bz2 |
BUG: make sure handles are always closed even if Wait is not called.
-rw-r--r-- | Source/cmWin32ProcessExecution.cxx | 83 | ||||
-rw-r--r-- | Source/cmWin32ProcessExecution.h | 2 |
2 files changed, 50 insertions, 35 deletions
diff --git a/Source/cmWin32ProcessExecution.cxx b/Source/cmWin32ProcessExecution.cxx index 6c9b050..78c54c2 100644 --- a/Source/cmWin32ProcessExecution.cxx +++ b/Source/cmWin32ProcessExecution.cxx @@ -685,6 +685,52 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring, return true; } +bool cmWin32ProcessExecution::CloseHandles() +{ + bool ret = true; + if (this->hChildStdinRd && !CloseHandle(this->hChildStdinRd)) + { + m_Output += "CloseHandleError\n"; + ret = false; + } + this->hChildStdinRd = 0; + if(this->hChildStdoutRdDup && !CloseHandle(this->hChildStdoutRdDup)) + { + m_Output += "CloseHandleError\n"; + ret = false; + } + this->hChildStdoutRdDup = 0; + if(this->hChildStderrRdDup && !CloseHandle(this->hChildStderrRdDup)) + { + m_Output += "CloseHandleError\n"; + ret = false; + } + this->hChildStderrRdDup = 0; + if(this->hChildStdinWrDup && !CloseHandle(this->hChildStdinWrDup)) + { + m_Output += "CloseHandleError\n"; + ret = false; + } + this->hChildStdinWrDup = 0; + if (this->hChildStdoutWr && !CloseHandle(this->hChildStdoutWr)) + { + m_Output += "CloseHandleError\n"; + ret = false; + } + this->hChildStdoutWr = 0; + if (this->hChildStderrWr && !CloseHandle(this->hChildStderrWr)) + { + m_Output += "CloseHandleError\n"; + ret = false; + } + this->hChildStderrWr = 0; + return ret; +} +cmWin32ProcessExecution::~cmWin32ProcessExecution() +{ + this->CloseHandles(); +} + /* * Wrapper for fclose() to use for popen* files, so we can retrieve the * exit code for the child process and return as a result of the close. @@ -806,41 +852,8 @@ bool cmWin32ProcessExecution::PrivateClose(int /* timeout */) CloseHandle(hProcess); m_ExitValue = result; m_Output += output; - - if (this->hChildStdinRd && !CloseHandle(this->hChildStdinRd)) - { - m_Output += "CloseHandleError\n"; - return false; - } - if(this->hChildStdoutRdDup && !CloseHandle(this->hChildStdoutRdDup)) - { - m_Output += "CloseHandleError\n"; - return false; - } - if(this->hChildStderrRdDup && !CloseHandle(this->hChildStderrRdDup)) - { - m_Output += "CloseHandleError\n"; - return false; - } - if(this->hChildStdinWrDup && !CloseHandle(this->hChildStdinWrDup)) - { - m_Output += "CloseHandleError\n"; - return false; - } - if (this->hChildStdoutWr && !CloseHandle(this->hChildStdoutWr)) - { - m_Output += "CloseHandleError\n"; - return false; - } - - if (this->hChildStderrWr && !CloseHandle(this->hChildStderrWr)) - { - m_Output += "CloseHandleError\n"; - return false; - } - - - if ( result < 0 ) + bool ret = this->CloseHandles(); + if ( result < 0 || !ret) { return false; } diff --git a/Source/cmWin32ProcessExecution.h b/Source/cmWin32ProcessExecution.h index 822999c..6f6d8b7 100644 --- a/Source/cmWin32ProcessExecution.h +++ b/Source/cmWin32ProcessExecution.h @@ -49,6 +49,7 @@ public: this->SetConsoleSpawn("w9xpopen.exe"); this->Initialize(); } + ~cmWin32ProcessExecution(); ///! If true windows will be created hidden. void SetHideWindows(bool v) { m_HideWindows = v; } @@ -139,6 +140,7 @@ public: int timeout, bool hideWindows); private: + bool CloseHandles(); bool PrivateOpen(const char*, const char*, int, int); bool PrivateClose(int timeout); |