Skip to content
Branch: master
Find file Copy path
Find file Copy path
10 contributors

Users who have contributed to this file

@tensorflower-gardener @hawkinsp @jing-dong @rjpower @gunan @skye @josh11b @jlebar @jeffreyadean @bmzhao
185 lines (143 sloc) 5.87 KB
/* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
See the License for the specific language governing permissions and
limitations under the License.
#include <functional>
#include <iosfwd>
#include <memory>
#include <string>
#include "tensorflow/core/platform/logging.h"
#include "tensorflow/core/platform/macros.h"
#include "tensorflow/core/platform/stringpiece.h"
#include "tensorflow/core/platform/types.h"
#include "tensorflow/core/protobuf/error_codes.pb.h"
namespace tensorflow {
#if defined(__clang__)
// Only clang supports warn_unused_result as a type annotation.
class TF_MUST_USE_RESULT Status;
/// @ingroup core
/// Denotes success or failure of a call in Tensorflow.
class Status {
/// Create a success status.
Status() {}
/// \brief Create a status with the specified error code and msg as a
/// human-readable string containing more detailed information.
Status(tensorflow::error::Code code, tensorflow::StringPiece msg);
/// Copy the specified status.
Status(const Status& s);
void operator=(const Status& s);
static Status OK() { return Status(); }
/// Returns true iff the status indicates success.
bool ok() const { return (state_ == NULL); }
tensorflow::error::Code code() const {
return ok() ? tensorflow::error::OK : state_->code;
const string& error_message() const {
return ok() ? empty_string() : state_->msg;
bool operator==(const Status& x) const;
bool operator!=(const Status& x) const;
/// \brief If `ok()`, stores `new_status` into `*this`. If `!ok()`,
/// preserves the current status, but may augment with additional
/// information about `new_status`.
/// Convenient way of keeping track of the first error encountered.
/// Instead of:
/// `if (overall_status.ok()) overall_status = new_status`
/// Use:
/// `overall_status.Update(new_status);`
void Update(const Status& new_status);
/// \brief Return a string representation of this status suitable for
/// printing. Returns the string `"OK"` for success.
string ToString() const;
// Ignores any errors. This method does nothing except potentially suppress
// complaints from any tools that are checking that errors are not dropped on
// the floor.
void IgnoreError() const;
static const string& empty_string();
struct State {
tensorflow::error::Code code;
string msg;
// OK status has a `NULL` state_. Otherwise, `state_` points to
// a `State` structure containing the error code and message(s)
std::unique_ptr<State> state_;
void SlowCopyFrom(const State* src);
// Helper class to manage multiple child status values.
class StatusGroup {
// Utility function to mark a Status as derived. By marking derived status,
// Derived status messages are ignored when reporting errors to end users.
static Status MakeDerived(const Status& s);
static bool IsDerived(const Status& s);
// Enable warning and error log collection for appending to the aggregated
// status. This function may be called more than once.
static void ConfigureLogHistory();
// Return a merged status with combined child status messages with a summary.
Status as_summary_status() const;
// Return a merged status with combined child status messages with
// concatenation.
Status as_concatenated_status() const;
bool ok() const { return ok_; }
// Augment this group with the child status `status`.
void Update(const Status& status);
// Attach recent warning and error log messages
void AttachLogMessages();
bool HasLogMessages() const { return !recent_logs_.empty(); }
bool ok_ = true;
size_t num_ok_ = 0;
std::vector<Status> children_;
std::vector<std::string> recent_logs_; // recent warning and error logs
inline Status::Status(const Status& s)
: state_((s.state_ == NULL) ? NULL : new State(*s.state_)) {}
inline void Status::operator=(const Status& s) {
// The following condition catches both aliasing (when this == &s),
// and the common case where both s and *this are ok.
if (state_ != s.state_) {
inline bool Status::operator==(const Status& x) const {
return (this->state_ == x.state_) || (ToString() == x.ToString());
inline bool Status::operator!=(const Status& x) const { return !(*this == x); }
/// @ingroup core
std::ostream& operator<<(std::ostream& os, const Status& x);
typedef std::function<void(const Status&)> StatusCallback;
extern tensorflow::string* TfCheckOpHelperOutOfLine(
const ::tensorflow::Status& v, const char* msg);
inline tensorflow::string* TfCheckOpHelper(::tensorflow::Status v,
const char* msg) {
if (v.ok()) return nullptr;
return TfCheckOpHelperOutOfLine(v, msg);
#define TF_DO_CHECK_OK(val, level) \
while (auto _result = ::tensorflow::TfCheckOpHelper(val, #val)) \
LOG(level) << *(_result)
#define TF_CHECK_OK(val) TF_DO_CHECK_OK(val, FATAL)
// DEBUG only version of TF_CHECK_OK. Compiler still parses 'val' even in opt
// mode.
#ifndef NDEBUG
#define TF_DCHECK_OK(val) TF_CHECK_OK(val)
#define TF_DCHECK_OK(val) \
while (false && (::tensorflow::Status::OK() == (val))) LOG(FATAL)
} // namespace tensorflow
You can’t perform that action at this time.