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_experimental.h",
|
||||
"tf_attrtype.h",
|
||||
"tf_status.h",
|
||||
],
|
||||
visibility = ["//tensorflow:__subpackages__"],
|
||||
)
|
||||
@ -52,6 +53,7 @@ tf_cuda_library(
|
||||
hdrs = [
|
||||
"c_api.h",
|
||||
"c_api_internal.h",
|
||||
"tf_status.h",
|
||||
],
|
||||
visibility = [
|
||||
"//tensorflow:internal",
|
||||
@ -84,6 +86,7 @@ tf_cuda_library(
|
||||
hdrs = [
|
||||
"c_api.h",
|
||||
"tf_attrtype.h",
|
||||
"tf_status.h",
|
||||
],
|
||||
copts = tf_copts(),
|
||||
visibility = ["//visibility:public"],
|
||||
@ -106,7 +109,9 @@ tf_cuda_library(
|
||||
"c_api.cc",
|
||||
"c_api_function.cc",
|
||||
],
|
||||
hdrs = ["c_api.h"],
|
||||
hdrs = [
|
||||
"c_api.h",
|
||||
],
|
||||
copts = tf_copts(),
|
||||
visibility = ["//tensorflow/c:__subpackages__"],
|
||||
deps = [
|
||||
@ -117,6 +122,7 @@ tf_cuda_library(
|
||||
"//tensorflow/core:android_tensorflow_lib_lite",
|
||||
],
|
||||
"//conditions:default": [
|
||||
":tf_status",
|
||||
"@com_google_absl//absl/strings",
|
||||
"//tensorflow/cc/saved_model:loader_lite",
|
||||
"//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(
|
||||
name = "c_api_experimental",
|
||||
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 {
|
||||
class TF_ManagedBuffer : public TensorBuffer {
|
||||
public:
|
||||
|
@ -20,6 +20,7 @@ limitations under the License.
|
||||
#include <stdint.h>
|
||||
|
||||
#include "tensorflow/c/tf_attrtype.h"
|
||||
#include "tensorflow/c/tf_status.h"
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// C API for TensorFlow.
|
||||
@ -130,53 +131,6 @@ typedef enum TF_DataType {
|
||||
// (eg. TF_STRING) or on failure.
|
||||
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.
|
||||
|
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) \
|
||||
tensorflow/c/c_api.cc \
|
||||
tensorflow/c/kernels.cc \
|
||||
tensorflow/c/tf_status.cc \
|
||||
tensorflow/c/tf_status_helper.cc \
|
||||
$(wildcard tensorflow/core/*.cc) \
|
||||
$(wildcard tensorflow/core/common_runtime/*.cc) \
|
||||
|
@ -18,6 +18,7 @@ limitations under the License.
|
||||
%{
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "tensorflow/c/tf_status.h"
|
||||
#include "tensorflow/core/platform/types.h"
|
||||
using tensorflow::uint64;
|
||||
using tensorflow::string;
|
||||
@ -230,6 +231,8 @@ _COPY_TYPEMAPS(unsigned int, mode_t);
|
||||
%define override %enddef
|
||||
#endif
|
||||
|
||||
%include "tensorflow/c/tf_status.h"
|
||||
|
||||
// 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
|
||||
// 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/c/tf_status.h"
|
||||
|
||||
%ignore "";
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user