mindspore2022/mindspore/core/utils/status.cc

217 lines
9.6 KiB
C++

/**
* This is the C++ adaptation and derivative work of Myia (https://github.com/mila-iqia/myia/).
*
* Copyright 2019 Huawei Technologies Co., Ltd
*
* 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 "include/api/status.h"
#ifndef ENABLE_ANDROID
#include <thread>
#endif
#include <map>
#include <sstream>
namespace mindspore {
struct Status::Data {
enum StatusCode status_code = kSuccess;
std::string status_msg;
int line_of_code = -1;
std::string file_name;
std::string err_description;
};
Status::Status() : data_(std::make_shared<Data>()) {}
Status::Status(enum StatusCode status_code, const std::vector<char> &status_msg) : data_(std::make_shared<Data>()) {
if (data_ == nullptr) {
return;
}
data_->err_description = CharToString(status_msg);
data_->status_msg = CharToString(status_msg);
data_->status_code = status_code;
}
Status::Status(enum StatusCode code, int line_of_code, const char *file_name, const std::vector<char> &extra)
: data_(std::make_shared<Data>()) {
if (data_ == nullptr) {
return;
}
data_->status_code = code;
data_->line_of_code = line_of_code;
if (file_name != nullptr) {
data_->file_name = file_name;
}
data_->err_description = CharToString(extra);
std::ostringstream ss;
#ifndef ENABLE_ANDROID
#ifdef DEBUG
ss << "Thread ID " << std::this_thread::get_id() << " " << CodeAsString(code) << ". ";
#else
ss << CodeAsString(code) << ". ";
#endif
if (!data_->err_description.empty()) {
ss << data_->err_description;
}
ss << "\n";
#endif
ss << "Line of code : " << line_of_code << "\n";
if (file_name != nullptr) {
ss << "File : " << file_name << "\n";
}
data_->status_msg = ss.str();
}
enum StatusCode Status::StatusCode() const {
if (data_ == nullptr) {
return kSuccess;
}
return data_->status_code;
}
std::vector<char> Status::ToCString() const {
if (data_ == nullptr) {
return std::vector<char>();
}
return StringToChar(data_->status_msg);
}
int Status::GetLineOfCode() const {
if (data_ == nullptr) {
return -1;
}
return data_->line_of_code;
}
std::vector<char> Status::GetErrDescriptionChar() const {
if (data_ == nullptr) {
return std::vector<char>();
}
return StringToChar(data_->err_description);
}
std::vector<char> Status::CodeAsCString(enum StatusCode c) {
static std::map<enum StatusCode, std::string> info_map = {{kSuccess, "No error occurs."},
// Core
{kCoreFailed, "Common error code."},
// MD
{kMDOutOfMemory, "Out of memory"},
{kMDShapeMisMatch, "Shape is incorrect"},
{kMDInterrupted, "Interrupted system call"},
{kMDNoSpace, "No space left on device"},
{kMDPyFuncException, "Exception thrown from PyFunc"},
{kMDDuplicateKey, "Duplicate key"},
{kMDPythonInterpreterFailure, ""},
{kMDTDTPushFailure, "Unexpected error"},
{kMDFileNotExist, "Unexpected error"},
{kMDProfilingError, "Error encountered while profiling"},
{kMDBoundingBoxOutOfBounds, "Unexpected error"},
{kMDBoundingBoxInvalidShape, "Unexpected error"},
{kMDSyntaxError, "Syntax error"},
{kMDTimeOut, "Unexpected error"},
{kMDBuddySpaceFull, "BuddySpace full"},
{kMDNetWorkError, "Network error"},
{kMDNotImplementedYet, "Unexpected error"},
{kMDUnexpectedError, "Unexpected error"},
// ME
{kMEFailed, "Common error code."},
{kMEInvalidInput, "Invalid input."},
// MC
{kMCFailed, "Common error code."},
{kMCDeviceError, "Device error."},
{kMCInvalidInput, "Invalid input."},
{kMCInvalidArgs, "Invalid arguments."},
// Lite
{kLiteError, "Common error code."},
{kLiteNullptr, "NULL pointer returned."},
{kLiteParamInvalid, "Invalid parameter."},
{kLiteNoChange, "No change."},
{kLiteSuccessExit, "No error but exit."},
{kLiteMemoryFailed, "Fail to create memory."},
{kLiteNotSupport, "Fail to support."},
{kLiteThreadPoolError, "Thread pool error."},
{kLiteOutOfTensorRange, "Failed to check range."},
{kLiteInputTensorError, "Failed to check input tensor."},
{kLiteReentrantError, "Exist executor running."},
{kLiteGraphFileError, "Failed to verify graph file."},
{kLiteNotFindOp, "Failed to find operator."},
{kLiteInvalidOpName, "Invalid operator name."},
{kLiteInvalidOpAttr, "Invalid operator attr."},
{kLiteOpExecuteFailure, "Failed to execution operator."},
{kLiteFormatError, "Failed to checking tensor format."},
{kLiteInferError, "Failed to infer shape."},
{kLiteInferInvalid, "Invalid infer shape before runtime."},
{kLiteInputParamInvalid, "Invalid input param by user."}};
auto iter = info_map.find(c);
return StringToChar(iter == info_map.end() ? "Unknown error" : iter->second);
}
std::ostream &operator<<(std::ostream &os, const Status &s) {
os << s.ToString();
return os;
}
std::vector<char> Status::SetErrDescription(const std::vector<char> &err_description) {
if (data_ == nullptr) {
return std::vector<char>();
}
data_->err_description = CharToString(err_description);
std::ostringstream ss;
#ifndef ENABLE_ANDROID
#ifdef DEBUG
ss << "Thread ID " << std::this_thread::get_id() << " " << CodeAsString(data_->status_code) << ". ";
#else
ss << CodeAsString(data_->status_code) << ". ";
#endif
if (!data_->err_description.empty()) {
ss << data_->err_description;
}
ss << "\n";
#endif
if (data_->line_of_code > 0 && !data_->file_name.empty()) {
ss << "Line of code : " << data_->line_of_code << "\n";
ss << "File : " << data_->file_name << "\n";
}
data_->status_msg = ss.str();
return StringToChar(data_->status_msg);
}
bool Status::operator==(const Status &other) const {
if (data_ == nullptr && other.data_ == nullptr) {
return true;
}
if (data_ == nullptr || other.data_ == nullptr) {
return false;
}
return data_->status_code == other.data_->status_code;
}
bool Status::operator==(enum StatusCode other_code) const { return StatusCode() == other_code; }
bool Status::operator!=(const Status &other) const { return !operator==(other); }
bool Status::operator!=(enum StatusCode other_code) const { return !operator==(other_code); }
Status::operator bool() const { return (StatusCode() == kSuccess); }
Status::operator int() const { return static_cast<int>(StatusCode()); }
Status Status::OK() { return StatusCode::kSuccess; }
bool Status::IsOk() const { return (StatusCode() == StatusCode::kSuccess); }
bool Status::IsError() const { return !IsOk(); }
} // namespace mindspore