Files
mlpack/fastlib/branches/fastlib-old/trilinos/include/Teuchos_ErrorPolling.hpp
T
Ryan Curtin f6864dd435 Move fastlib-old (originally 'fastlib') to fastlib/branches/fastlib-old where it
will sit until the end of time and nobody will touch it because it's old
2010-01-31 22:31:55 +00:00

116 lines
4.4 KiB
C++

// @HEADER
// ***********************************************************************
//
// Teuchos: Common Tools Package
// Copyright (2004) Sandia Corporation
//
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
// license for use of this work by or on behalf of the U.S. Government.
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
//
// ***********************************************************************
// @HEADER
#ifndef TEUCHOS_ERRORPOLLING_H
#define TEUCHOS_ERRORPOLLING_H
#include "Teuchos_ConfigDefs.hpp"
#include "Teuchos_TestForException.hpp"
/*! \defgroup ErrorPolling_grp Utility code for synchronizing std::exception detection across processors.
*/
//@{
namespace Teuchos
{
class MPIComm;
/** \brief ErrorPolling provides utilities for establishing agreement
* between processors on whether an std::exception has been detected on any one
* processor.
*
* The two functions must be used in a coordinated way. The simplest use
* case is to embed a call to reportFailure() whenever an std::exception is
* detected at the top-level try/catch block, and then to do a call to
* pollForFailures() whenever it is desired to check for off-processor
* errors before proceeding. The macro
\code
TEUCHOS_TEST_FOR_FAILURE(comm);
\endcode
* calls pollForFailures() and throws an std::exception if the return value is
* true.
*
* Polling is a collective operation (an MPI_Reduce) and so incurs some
* performance overhead. It can be disabled with a call to
* \code
* Teuchos::ErrorPolling::disable();
* \endcode
* IMPORTANT: all processors must agree on whether collective error checking
* is enabled or disabled. If there are inconsistent states, the reduction
* operations in pollForFailures() will hang because some processors cannot be
* contacted.
*/
class ErrorPolling
{
public:
/** Call this function upon catching an std::exception in order to
* inform other processors of the error. This function will do an
* AllReduce in conjunction with calls to either this function or
* its partner, pollForFailures(), on the other processors. This
* procedure has the effect of communicating to the other
* processors that an std::exception has been detected on this one. */
static void reportFailure(const MPIComm& comm);
/** Call this function after std::exception-free completion of a
* try/catch block. This function will do an AllReduce in
* conjunction with calls to either this function or its partner,
* reportFailure(), on the other processors. If a failure has been
* reported by another processor, the call to pollForFailures()
* will return true and an std::exception can be thrown. */
static bool pollForFailures(const MPIComm& comm);
/** Activate error polling */
static void enable() {isActive()=true;}
/** Disable error polling */
static void disable() {isActive()=false;}
private:
/** Set or check whether error polling is active */
static bool& isActive() {static bool rtn = true; return rtn;}
};
/**
* This macro polls all processors in the given communicator to find
* out whether an error has been reported by a call to
* ErrorPolling::reportFailure(comm).
*
* @param comm [in] The communicator on which polling will be done
*/
#define TEUCHOS_POLL_FOR_FAILURES(comm) \
TEST_FOR_EXCEPTION(Teuchos::ErrorPolling::pollForFailures(comm), \
std::runtime_error, \
"off-processor error detected by proc=" << (comm).getRank());
}
//@}
#endif