Split TF_Status into its own header.
This change allows users to depend on TF_Status and its associated constants (e.g. TF_OK, TF_INVALID_ARGUMENT, etc) without bringing in the whole C API. The first intended user is the C op definition API, which cannot depend on the C API, because the C API itself depends on op definitions, causing circular dependencies. PiperOrigin-RevId: 248816896
This commit is contained in:
parent
8630f9f532
commit
f341636ee4
@ -22,6 +22,7 @@ filegroup(
|
|||||||
"c_api.h",
|
"c_api.h",
|
||||||
"c_api_experimental.h",
|
"c_api_experimental.h",
|
||||||
"tf_attrtype.h",
|
"tf_attrtype.h",
|
||||||
|
"tf_status.h",
|
||||||
],
|
],
|
||||||
visibility = ["//tensorflow:__subpackages__"],
|
visibility = ["//tensorflow:__subpackages__"],
|
||||||
)
|
)
|
||||||
@ -52,6 +53,7 @@ tf_cuda_library(
|
|||||||
hdrs = [
|
hdrs = [
|
||||||
"c_api.h",
|
"c_api.h",
|
||||||
"c_api_internal.h",
|
"c_api_internal.h",
|
||||||
|
"tf_status.h",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//tensorflow:internal",
|
"//tensorflow:internal",
|
||||||
@ -84,6 +86,7 @@ tf_cuda_library(
|
|||||||
hdrs = [
|
hdrs = [
|
||||||
"c_api.h",
|
"c_api.h",
|
||||||
"tf_attrtype.h",
|
"tf_attrtype.h",
|
||||||
|
"tf_status.h",
|
||||||
],
|
],
|
||||||
copts = tf_copts(),
|
copts = tf_copts(),
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
@ -106,7 +109,9 @@ tf_cuda_library(
|
|||||||
"c_api.cc",
|
"c_api.cc",
|
||||||
"c_api_function.cc",
|
"c_api_function.cc",
|
||||||
],
|
],
|
||||||
hdrs = ["c_api.h"],
|
hdrs = [
|
||||||
|
"c_api.h",
|
||||||
|
],
|
||||||
copts = tf_copts(),
|
copts = tf_copts(),
|
||||||
visibility = ["//tensorflow/c:__subpackages__"],
|
visibility = ["//tensorflow/c:__subpackages__"],
|
||||||
deps = [
|
deps = [
|
||||||
@ -117,6 +122,7 @@ tf_cuda_library(
|
|||||||
"//tensorflow/core:android_tensorflow_lib_lite",
|
"//tensorflow/core:android_tensorflow_lib_lite",
|
||||||
],
|
],
|
||||||
"//conditions:default": [
|
"//conditions:default": [
|
||||||
|
":tf_status",
|
||||||
"@com_google_absl//absl/strings",
|
"@com_google_absl//absl/strings",
|
||||||
"//tensorflow/cc/saved_model:loader_lite",
|
"//tensorflow/cc/saved_model:loader_lite",
|
||||||
"//tensorflow/cc:gradients",
|
"//tensorflow/cc:gradients",
|
||||||
@ -137,6 +143,22 @@ tf_cuda_library(
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "tf_status",
|
||||||
|
srcs = ["tf_status.cc"],
|
||||||
|
hdrs = ["tf_status.h"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = select({
|
||||||
|
"//tensorflow:android": [
|
||||||
|
"//tensorflow/core:android_tensorflow_lib_lite",
|
||||||
|
],
|
||||||
|
"//conditions:default": [
|
||||||
|
"//tensorflow/c:c_api_internal",
|
||||||
|
"//tensorflow/core:lib",
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
tf_cuda_library(
|
tf_cuda_library(
|
||||||
name = "c_api_experimental",
|
name = "c_api_experimental",
|
||||||
srcs = [
|
srcs = [
|
||||||
|
@ -116,28 +116,6 @@ size_t TF_DataTypeSize(TF_DataType dt) {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
TF_Status* TF_NewStatus() { return new TF_Status; }
|
|
||||||
|
|
||||||
void TF_DeleteStatus(TF_Status* s) { delete s; }
|
|
||||||
|
|
||||||
void TF_SetStatus(TF_Status* s, TF_Code code, const char* msg) {
|
|
||||||
if (code == TF_OK) {
|
|
||||||
s->status = Status::OK();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
s->status = Status(static_cast<Code>(code), tensorflow::StringPiece(msg));
|
|
||||||
}
|
|
||||||
|
|
||||||
TF_Code TF_GetCode(const TF_Status* s) {
|
|
||||||
return static_cast<TF_Code>(s->status.code());
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* TF_Message(const TF_Status* s) {
|
|
||||||
return s->status.error_message().c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
class TF_ManagedBuffer : public TensorBuffer {
|
class TF_ManagedBuffer : public TensorBuffer {
|
||||||
public:
|
public:
|
||||||
|
@ -20,6 +20,7 @@ limitations under the License.
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "tensorflow/c/tf_attrtype.h"
|
#include "tensorflow/c/tf_attrtype.h"
|
||||||
|
#include "tensorflow/c/tf_status.h"
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// C API for TensorFlow.
|
// C API for TensorFlow.
|
||||||
@ -130,53 +131,6 @@ typedef enum TF_DataType {
|
|||||||
// (eg. TF_STRING) or on failure.
|
// (eg. TF_STRING) or on failure.
|
||||||
TF_CAPI_EXPORT extern size_t TF_DataTypeSize(TF_DataType dt);
|
TF_CAPI_EXPORT extern size_t TF_DataTypeSize(TF_DataType dt);
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// TF_Code holds an error code. The enum values here are identical to
|
|
||||||
// corresponding values in error_codes.proto.
|
|
||||||
typedef enum TF_Code {
|
|
||||||
TF_OK = 0,
|
|
||||||
TF_CANCELLED = 1,
|
|
||||||
TF_UNKNOWN = 2,
|
|
||||||
TF_INVALID_ARGUMENT = 3,
|
|
||||||
TF_DEADLINE_EXCEEDED = 4,
|
|
||||||
TF_NOT_FOUND = 5,
|
|
||||||
TF_ALREADY_EXISTS = 6,
|
|
||||||
TF_PERMISSION_DENIED = 7,
|
|
||||||
TF_UNAUTHENTICATED = 16,
|
|
||||||
TF_RESOURCE_EXHAUSTED = 8,
|
|
||||||
TF_FAILED_PRECONDITION = 9,
|
|
||||||
TF_ABORTED = 10,
|
|
||||||
TF_OUT_OF_RANGE = 11,
|
|
||||||
TF_UNIMPLEMENTED = 12,
|
|
||||||
TF_INTERNAL = 13,
|
|
||||||
TF_UNAVAILABLE = 14,
|
|
||||||
TF_DATA_LOSS = 15,
|
|
||||||
} TF_Code;
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// TF_Status holds error information. It either has an OK code, or
|
|
||||||
// else an error code with an associated error message.
|
|
||||||
typedef struct TF_Status TF_Status;
|
|
||||||
|
|
||||||
// Return a new status object.
|
|
||||||
TF_CAPI_EXPORT extern TF_Status* TF_NewStatus(void);
|
|
||||||
|
|
||||||
// Delete a previously created status object.
|
|
||||||
TF_CAPI_EXPORT extern void TF_DeleteStatus(TF_Status*);
|
|
||||||
|
|
||||||
// Record <code, msg> in *s. Any previous information is lost.
|
|
||||||
// A common use is to clear a status: TF_SetStatus(s, TF_OK, "");
|
|
||||||
TF_CAPI_EXPORT extern void TF_SetStatus(TF_Status* s, TF_Code code,
|
|
||||||
const char* msg);
|
|
||||||
|
|
||||||
// Return the code record in *s.
|
|
||||||
TF_CAPI_EXPORT extern TF_Code TF_GetCode(const TF_Status* s);
|
|
||||||
|
|
||||||
// Return a pointer to the (null-terminated) error message in *s. The
|
|
||||||
// return value points to memory that is only usable until the next
|
|
||||||
// mutation to *s. Always returns an empty string if TF_GetCode(s) is
|
|
||||||
// TF_OK.
|
|
||||||
TF_CAPI_EXPORT extern const char* TF_Message(const TF_Status* s);
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// TF_Buffer holds a pointer to a block of data and its associated length.
|
// TF_Buffer holds a pointer to a block of data and its associated length.
|
||||||
|
42
tensorflow/c/tf_status.cc
Normal file
42
tensorflow/c/tf_status.cc
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/* Copyright 2019 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#include "tensorflow/c/tf_status.h"
|
||||||
|
|
||||||
|
#include "tensorflow/c/c_api_internal.h"
|
||||||
|
#include "tensorflow/core/lib/core/status.h"
|
||||||
|
|
||||||
|
using ::tensorflow::Status;
|
||||||
|
using ::tensorflow::error::Code;
|
||||||
|
|
||||||
|
TF_Status* TF_NewStatus() { return new TF_Status; }
|
||||||
|
|
||||||
|
void TF_DeleteStatus(TF_Status* s) { delete s; }
|
||||||
|
|
||||||
|
void TF_SetStatus(TF_Status* s, TF_Code code, const char* msg) {
|
||||||
|
if (code == TF_OK) {
|
||||||
|
s->status = Status::OK();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s->status = Status(static_cast<Code>(code), tensorflow::StringPiece(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
TF_Code TF_GetCode(const TF_Status* s) {
|
||||||
|
return static_cast<TF_Code>(s->status.code());
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* TF_Message(const TF_Status* s) {
|
||||||
|
return s->status.error_message().c_str();
|
||||||
|
}
|
88
tensorflow/c/tf_status.h
Normal file
88
tensorflow/c/tf_status.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/* Copyright 2019 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_C_TF_STATUS_H_
|
||||||
|
#define TENSORFLOW_C_TF_STATUS_H_
|
||||||
|
|
||||||
|
#ifdef SWIG
|
||||||
|
#define TF_CAPI_EXPORT
|
||||||
|
#else
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#ifdef TF_COMPILE_LIBRARY
|
||||||
|
#define TF_CAPI_EXPORT __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define TF_CAPI_EXPORT __declspec(dllimport)
|
||||||
|
#endif // TF_COMPILE_LIBRARY
|
||||||
|
#else
|
||||||
|
#define TF_CAPI_EXPORT __attribute__((visibility("default")))
|
||||||
|
#endif // _WIN32
|
||||||
|
#endif // SWIG
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct TF_Status TF_Status;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// TF_Code holds an error code. The enum values here are identical to
|
||||||
|
// corresponding values in error_codes.proto.
|
||||||
|
typedef enum TF_Code {
|
||||||
|
TF_OK = 0,
|
||||||
|
TF_CANCELLED = 1,
|
||||||
|
TF_UNKNOWN = 2,
|
||||||
|
TF_INVALID_ARGUMENT = 3,
|
||||||
|
TF_DEADLINE_EXCEEDED = 4,
|
||||||
|
TF_NOT_FOUND = 5,
|
||||||
|
TF_ALREADY_EXISTS = 6,
|
||||||
|
TF_PERMISSION_DENIED = 7,
|
||||||
|
TF_UNAUTHENTICATED = 16,
|
||||||
|
TF_RESOURCE_EXHAUSTED = 8,
|
||||||
|
TF_FAILED_PRECONDITION = 9,
|
||||||
|
TF_ABORTED = 10,
|
||||||
|
TF_OUT_OF_RANGE = 11,
|
||||||
|
TF_UNIMPLEMENTED = 12,
|
||||||
|
TF_INTERNAL = 13,
|
||||||
|
TF_UNAVAILABLE = 14,
|
||||||
|
TF_DATA_LOSS = 15,
|
||||||
|
} TF_Code;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Return a new status object.
|
||||||
|
TF_CAPI_EXPORT extern TF_Status* TF_NewStatus(void);
|
||||||
|
|
||||||
|
// Delete a previously created status object.
|
||||||
|
TF_CAPI_EXPORT extern void TF_DeleteStatus(TF_Status*);
|
||||||
|
|
||||||
|
// Record <code, msg> in *s. Any previous information is lost.
|
||||||
|
// A common use is to clear a status: TF_SetStatus(s, TF_OK, "");
|
||||||
|
TF_CAPI_EXPORT extern void TF_SetStatus(TF_Status* s, TF_Code code,
|
||||||
|
const char* msg);
|
||||||
|
|
||||||
|
// Return the code record in *s.
|
||||||
|
TF_CAPI_EXPORT extern TF_Code TF_GetCode(const TF_Status* s);
|
||||||
|
|
||||||
|
// Return a pointer to the (null-terminated) error message in *s. The
|
||||||
|
// return value points to memory that is only usable until the next
|
||||||
|
// mutation to *s. Always returns an empty string if TF_GetCode(s) is
|
||||||
|
// TF_OK.
|
||||||
|
TF_CAPI_EXPORT extern const char* TF_Message(const TF_Status* s);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* end extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_C_TF_STATUS_H_
|
@ -636,6 +636,7 @@ CORE_CC_ALL_SRCS := \
|
|||||||
$(ABSL_CC_SRCS) \
|
$(ABSL_CC_SRCS) \
|
||||||
tensorflow/c/c_api.cc \
|
tensorflow/c/c_api.cc \
|
||||||
tensorflow/c/kernels.cc \
|
tensorflow/c/kernels.cc \
|
||||||
|
tensorflow/c/tf_status.cc \
|
||||||
tensorflow/c/tf_status_helper.cc \
|
tensorflow/c/tf_status_helper.cc \
|
||||||
$(wildcard tensorflow/core/*.cc) \
|
$(wildcard tensorflow/core/*.cc) \
|
||||||
$(wildcard tensorflow/core/common_runtime/*.cc) \
|
$(wildcard tensorflow/core/common_runtime/*.cc) \
|
||||||
|
@ -18,6 +18,7 @@ limitations under the License.
|
|||||||
%{
|
%{
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include "tensorflow/c/tf_status.h"
|
||||||
#include "tensorflow/core/platform/types.h"
|
#include "tensorflow/core/platform/types.h"
|
||||||
using tensorflow::uint64;
|
using tensorflow::uint64;
|
||||||
using tensorflow::string;
|
using tensorflow::string;
|
||||||
@ -230,6 +231,8 @@ _COPY_TYPEMAPS(unsigned int, mode_t);
|
|||||||
%define override %enddef
|
%define override %enddef
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
%include "tensorflow/c/tf_status.h"
|
||||||
|
|
||||||
// Typemaps to automatically raise a Python exception from bad output TF_Status.
|
// Typemaps to automatically raise a Python exception from bad output TF_Status.
|
||||||
// TODO(b/77295559): expand this to all TF_Status* output params and deprecate
|
// TODO(b/77295559): expand this to all TF_Status* output params and deprecate
|
||||||
// raise_exception_on_not_ok_status (currently it only affects the C API).
|
// raise_exception_on_not_ok_status (currently it only affects the C API).
|
||||||
|
@ -14,6 +14,7 @@ limitations under the License.
|
|||||||
==============================================================================*/
|
==============================================================================*/
|
||||||
|
|
||||||
%include "tensorflow/python/platform/base.i"
|
%include "tensorflow/python/platform/base.i"
|
||||||
|
%include "tensorflow/c/tf_status.h"
|
||||||
|
|
||||||
%ignore "";
|
%ignore "";
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user