Listing 2: Checking post-conditions of a function
class PipePreparer
{
HANDLE ChildStdoutRead;
HANDLE ChildStdoutWrite;
HANDLE ChildStdinRead;
HANDLE ChildStdinWrite;
HANDLE ChildStdinWriteDup;
HANDLE SaveStdout;
HANDLE SaveStdin;
void PipePreparer::Finish( bool ChildCreatedOK,
HANDLE* pParentIn,
HANDLE* pParentOut );
...
}
void PipePreparer::Finish( bool ChildCreatedOK,
HANDLE* pParentIn,
HANDLE* pParentOut )
{
bool OK = ::CloseHandle( ChildStdoutWrite );
ChildStdoutWrite = INVALID_HANDLE_VALUE;
::CloseHandle( ChildStdinRead );
ChildStdinRead = INVALID_HANDLE_VALUE;
if( OK && ChildCreatedOK )
{
pParentOut = ChildStdinWriteDup;
ChildStdinWriteDup = INVALID_HANDLE_VALUE;
pParentIn = ChildStdoutRead;
ChildStdoutRead = INVALID_HANDLE_VALUE;
}
else
{
if( ChildStdinWriteDup != INVALID_HANDLE_VALUE )
{
::CloseHandle( ChildStdinWriteDup );
ChildStdinWriteDup = INVALID_HANDLE_VALUE;
}
if( ChildStdoutRead != INVALID_HANDLE_VALUE )
{
::CloseHandle( ChildStdoutRead );
ChildStdoutRead = INVALID_HANDLE_VALUE;
}
}
::SetStdHandle( STD_OUTPUT_HANDLE, SaveStdOut );
::SetStdHandle( STD_INPUT_HANDLE, SaveStdin );
assert( ChildStdoutRead == INVALID_HANDLE_VALUE );
assert( ChildStdoutWrite == INVALID_HANDLE_VALUE );
assert( ChildStdinRead == INVALID_HANDLE_VALUE );
assert( ChildStdinWrite == INVALID_HANDLE_VALUE );
assert( ChildStdinWriteDup == INVALID_HANDLE_VALUE );
}
//End of File