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