/*! * Copyright (c) 2016 by Contributors * \file c_api_error.h * \brief Common fields of all C APIs */ #ifndef NNVM_C_API_C_API_COMMON_H_ #define NNVM_C_API_C_API_COMMON_H_ #include <dmlc/base.h> #include <dmlc/logging.h> #include <dmlc/thread_local.h> #include <nnvm/c_api.h> #include <nnvm/symbolic.h> #include <vector> #include <string> /*! \brief macro to guard beginning and end section of all functions */ #define API_BEGIN() try { /*! \brief every function starts with API_BEGIN(); and finishes with API_END() or API_END_HANDLE_ERROR */ #define API_END() } catch(dmlc::Error &_except_) { return NNAPIHandleException(_except_); } return 0; // NOLINT(*) /*! * \brief every function starts with API_BEGIN(); * and finishes with API_END() or API_END_HANDLE_ERROR * The finally clause contains procedure to cleanup states when an error happens. */ #define API_END_HANDLE_ERROR(Finalize) } catch(dmlc::Error &_except_) { Finalize; return NNAPIHandleException(_except_); } return 0; // NOLINT(*) /*! \brief entry to to easily hold returning information */ struct NNAPIThreadLocalEntry { /*! \brief result holder for returning string */ std::string ret_str; /*! \brief result holder for returning strings */ std::vector<std::string> ret_vec_str; /*! \brief result holder for returning string pointers */ std::vector<const char *> ret_vec_charp; /*! \brief result holder for returning handles */ std::vector<void *> ret_handles; /*! \brief argument holder to hold symbol */ std::unordered_map<std::string, const nnvm::Symbol*> kwarg_symbol; }; /*! \brief Thread local store that can be used to hold return values. */ typedef dmlc::ThreadLocalStore<NNAPIThreadLocalEntry> NNAPIThreadLocalStore; /*! * \brief handle exception throwed out * \param e the exception * \return the return value of API after exception is handled */ inline int NNAPIHandleException(const dmlc::Error &e) { NNAPISetLastError(e.what()); return -1; } #endif // NNVM_C_API_C_API_COMMON_H_