diff --git a/tensorflow/core/BUILD b/tensorflow/core/BUILD index 25cd693317e..b0dec2447fa 100644 --- a/tensorflow/core/BUILD +++ b/tensorflow/core/BUILD @@ -433,6 +433,7 @@ filegroup( "//tensorflow/core/platform:profile_utils/i_cpu_utils_helper.h", "//tensorflow/core/platform:stacktrace.h", "//tensorflow/core/platform:stacktrace_handler.h", + "//tensorflow/core/platform:status.h", "//tensorflow/core/platform:stringpiece.h", "//tensorflow/core/platform:stringprintf.h", "//tensorflow/core/platform:strcat.h", @@ -491,6 +492,7 @@ cc_library( "//tensorflow/core/platform:macros", "//tensorflow/core/platform:protobuf", "//tensorflow/core/platform:platform", + "//tensorflow/core/platform:status", "//tensorflow/core/platform:stringpiece", "//tensorflow/core/platform:tstring", "//tensorflow/core/platform:types", @@ -529,9 +531,6 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":lib_internal", - "//tensorflow/core/platform:str_util", - "//tensorflow/core/platform:stringpiece", - "//tensorflow/core/platform:stringprintf", "@com_google_absl//absl/container:inlined_vector", "@com_google_absl//absl/strings", "@com_google_absl//absl/types:optional", @@ -2160,7 +2159,6 @@ cc_library( "@com_google_absl//absl/strings", "//third_party/eigen3", "@com_google_absl//absl/base:core_headers", - "//tensorflow/core/platform:regexp", "//tensorflow/core/platform/default/build_config:platformlib", ] + if_static([":lib_internal_impl"]), ) @@ -2281,9 +2279,11 @@ cc_library( "//tensorflow/core/platform:regexp", "//tensorflow/core/platform:scanner", "//tensorflow/core/platform:setround", - "//tensorflow/core/platform:strong_hash", + "//tensorflow/core/platform:status", "//tensorflow/core/platform:strcat", + "//tensorflow/core/platform:stringpiece", "//tensorflow/core/platform:stringprintf", + "//tensorflow/core/platform:strong_hash", "//tensorflow/core/platform:str_util", "//tensorflow/core/platform:subprocess", "//tensorflow/core/platform:tensor_coding", diff --git a/tensorflow/core/lib/core/BUILD b/tensorflow/core/lib/core/BUILD index 5e51b4bbf7d..af8ed227410 100644 --- a/tensorflow/core/lib/core/BUILD +++ b/tensorflow/core/lib/core/BUILD @@ -100,21 +100,9 @@ cc_library( cc_library( name = "status", - srcs = ["status.cc"], hdrs = ["status.h"], deps = [ - ":error_codes_proto_cc", - "//tensorflow/core:error_codes_proto_impl_cc", - "//tensorflow/core/platform:logging", - "//tensorflow/core/platform:macros", - "//tensorflow/core/platform:mutex", - "//tensorflow/core/platform:stacktrace", - "//tensorflow/core/platform:str_util", - "//tensorflow/core/platform:strcat", - "//tensorflow/core/platform:stringpiece", - "//tensorflow/core/platform:stringprintf", - "//tensorflow/core/platform:types", - "@com_google_absl//absl/base", + "//tensorflow/core/platform:status", ], ) @@ -190,7 +178,6 @@ filegroup( "arena.cc", "bitmap.cc", "coding.cc", - "status.cc", ], visibility = ["//tensorflow/core:__pkg__"], ) diff --git a/tensorflow/core/lib/core/status.h b/tensorflow/core/lib/core/status.h index a863f2fcc78..47a4908ebe7 100644 --- a/tensorflow/core/lib/core/status.h +++ b/tensorflow/core/lib/core/status.h @@ -16,185 +16,6 @@ limitations under the License. #ifndef TENSORFLOW_CORE_LIB_CORE_STATUS_H_ #define TENSORFLOW_CORE_LIB_CORE_STATUS_H_ -#include -#include -#include -#include - -#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; -#endif - -/// @ingroup core -/// Denotes success or failure of a call in Tensorflow. -class Status { - public: - /// 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); - Status& operator=(const Status& s); -#ifndef SWIG - Status(Status&& s) noexcept; - Status& operator=(Status&& s) noexcept; -#endif // SWIG - - 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; - - private: - 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_; - - void SlowCopyFrom(const State* src); -}; - -// Helper class to manage multiple child status values. -class StatusGroup { - public: - // 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(); } - - private: - bool ok_ = true; - size_t num_ok_ = 0; - std::vector children_; - std::vector recent_logs_; // recent warning and error logs -}; - -inline Status::Status(const Status& s) - : state_((s.state_ == nullptr) ? nullptr : new State(*s.state_)) {} - -inline Status& 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_) { - SlowCopyFrom(s.state_.get()); - } - return *this; -} - -#ifndef SWIG -inline Status::Status(Status&& s) noexcept : state_(std::move(s.state_)) {} - -inline Status& Status::operator=(Status&& s) noexcept { - if (state_ != s.state_) { - state_ = std::move(s.state_); - } - return *this; -} -#endif // SWIG - -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 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) -#define TF_QCHECK_OK(val) TF_DO_CHECK_OK(val, QFATAL) - -// 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) -#else -#define TF_DCHECK_OK(val) \ - while (false && (::tensorflow::Status::OK() == (val))) LOG(FATAL) -#endif - -} // namespace tensorflow +#include "tensorflow/core/platform/status.h" #endif // TENSORFLOW_CORE_LIB_CORE_STATUS_H_ diff --git a/tensorflow/core/platform/BUILD b/tensorflow/core/platform/BUILD index 4ec29ce22eb..5140d4506d9 100644 --- a/tensorflow/core/platform/BUILD +++ b/tensorflow/core/platform/BUILD @@ -427,6 +427,16 @@ cc_library( ], ) +cc_library( + name = "setround", + srcs = ["setround.cc"], + hdrs = ["setround.h"], + deps = [ + ":logging", + ":macros", + ], +) + cc_library( name = "stacktrace", hdrs = ["stacktrace.h"], @@ -453,12 +463,21 @@ cc_library( ) cc_library( - name = "setround", - srcs = ["setround.cc"], - hdrs = ["setround.h"], + name = "status", + srcs = ["status.cc"], + hdrs = ["status.h"], deps = [ ":logging", ":macros", + ":mutex", + ":stacktrace", + ":str_util", + ":strcat", + ":stringpiece", + ":stringprintf", + ":types", + "//tensorflow/core:error_codes_proto_impl_cc", + "@com_google_absl//absl/base", ], ) @@ -805,6 +824,7 @@ filegroup( "protobuf_util.cc", "scanner.cc", "setround.cc", + "status.cc", "strcat.cc", "stringprintf.cc", "str_util.cc", diff --git a/tensorflow/core/lib/core/status.cc b/tensorflow/core/platform/status.cc similarity index 99% rename from tensorflow/core/lib/core/status.cc rename to tensorflow/core/platform/status.cc index ac8d0fbd7b6..a7fd3e693a1 100644 --- a/tensorflow/core/lib/core/status.cc +++ b/tensorflow/core/platform/status.cc @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ -#include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/platform/status.h" #include diff --git a/tensorflow/core/platform/status.h b/tensorflow/core/platform/status.h new file mode 100644 index 00000000000..b9763a1dc71 --- /dev/null +++ b/tensorflow/core/platform/status.h @@ -0,0 +1,200 @@ +/* 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 + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_CORE_PLATFORM_STATUS_H_ +#define TENSORFLOW_CORE_PLATFORM_STATUS_H_ + +#include +#include +#include +#include + +#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; +#endif + +/// @ingroup core +/// Denotes success or failure of a call in Tensorflow. +class Status { + public: + /// 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); + Status& operator=(const Status& s); +#ifndef SWIG + Status(Status&& s) noexcept; + Status& operator=(Status&& s) noexcept; +#endif // SWIG + + 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; + + private: + 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_; + + void SlowCopyFrom(const State* src); +}; + +// Helper class to manage multiple child status values. +class StatusGroup { + public: + // 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(); } + + private: + bool ok_ = true; + size_t num_ok_ = 0; + std::vector children_; + std::vector recent_logs_; // recent warning and error logs +}; + +inline Status::Status(const Status& s) + : state_((s.state_ == nullptr) ? nullptr : new State(*s.state_)) {} + +inline Status& 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_) { + SlowCopyFrom(s.state_.get()); + } + return *this; +} + +#ifndef SWIG +inline Status::Status(Status&& s) noexcept : state_(std::move(s.state_)) {} + +inline Status& Status::operator=(Status&& s) noexcept { + if (state_ != s.state_) { + state_ = std::move(s.state_); + } + return *this; +} +#endif // SWIG + +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 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) +#define TF_QCHECK_OK(val) TF_DO_CHECK_OK(val, QFATAL) + +// 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) +#else +#define TF_DCHECK_OK(val) \ + while (false && (::tensorflow::Status::OK() == (val))) LOG(FATAL) +#endif + +} // namespace tensorflow + +#endif // TENSORFLOW_CORE_PLATFORM_STATUS_H_ diff --git a/tensorflow/python/lib/io/file_io.i b/tensorflow/python/lib/io/file_io.i index 087444fd2fa..cbd619bb764 100644 --- a/tensorflow/python/lib/io/file_io.i +++ b/tensorflow/python/lib/io/file_io.i @@ -276,7 +276,7 @@ string ReadFromStream(tensorflow::io::BufferedInputStream* stream, TF_Status* status); %ignore tensorflow::Status::operator=; -%include "tensorflow/core/lib/core/status.h" +%include "tensorflow/core/platform/status.h" %ignoreall %unignore tensorflow::io;