提交 b39f0033 编写于 作者: T TeslaZhao

fix bad code style by clang-format

上级 57fc2a09
...@@ -23,18 +23,20 @@ namespace paddle_serving { ...@@ -23,18 +23,20 @@ namespace paddle_serving {
namespace predictor { namespace predictor {
//////////////// DECLARE INTERFACE //////////////// //////////////// DECLARE INTERFACE ////////////////
#define DECLARE_FACTORY_OBJECT(D, B) \ #define DECLARE_FACTORY_OBJECT(D, B) \
static int regist(const std::string& tag) { \ static int regist(const std::string& tag) { \
FactoryDerive<D, B>* factory = new (std::nothrow) FactoryDerive<D, B>();\ FactoryDerive<D, B>* factory = new (std::nothrow) FactoryDerive<D, B>(); \
if (factory == NULL || \ if (factory == NULL || \
FactoryPool<B>::instance().register_factory(tag, factory) != 0) { \ FactoryPool<B>::instance().register_factory(tag, factory) != 0) { \
char err_str[ERROR_STRING_LEN]; \ char err_str[ERROR_STRING_LEN]; \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Failed regist factory: %s in macro!", #D); \ ERROR_STRING_LEN - 1, \
RAW_LOG(FATAL, err_str); \ "Failed regist factory: %s in macro!", \
return -1; \ #D); \
} \ RAW_LOG(FATAL, err_str); \
return 0; \ return -1; \
} \
return 0; \
} }
#define PDS_STR_CAT(a, b) PDS_STR_CAT_I(a, b) #define PDS_STR_CAT(a, b) PDS_STR_CAT_I(a, b)
...@@ -58,8 +60,11 @@ namespace predictor { ...@@ -58,8 +60,11 @@ namespace predictor {
::baidu::paddle_serving::predictor::FactoryPool<B>::instance() \ ::baidu::paddle_serving::predictor::FactoryPool<B>::instance() \
.register_factory(#D, factory) != 0) { \ .register_factory(#D, factory) != 0) { \
char err_str[ERROR_STRING_LEN]; \ char err_str[ERROR_STRING_LEN]; \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Failed regist factory: %s->%s in macro!", #D, #B); \ ERROR_STRING_LEN - 1, \
"Failed regist factory: %s->%s in macro!", \
#D, \
#B); \
RAW_LOG(FATAL, err_str); \ RAW_LOG(FATAL, err_str); \
return; \ return; \
} \ } \
...@@ -76,13 +81,21 @@ namespace predictor { ...@@ -76,13 +81,21 @@ namespace predictor {
if (factory == NULL || \ if (factory == NULL || \
::baidu::paddle_serving::predictor::FactoryPool<B>::instance() \ ::baidu::paddle_serving::predictor::FactoryPool<B>::instance() \
.register_factory(N, factory) != 0) { \ .register_factory(N, factory) != 0) { \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Failed regist factory: %s->%s, tag: %s in macro!", #D, #B, N); \ ERROR_STRING_LEN - 1, \
"Failed regist factory: %s->%s, tag: %s in macro!", \
#D, \
#B, \
N); \
RAW_LOG(FATAL, err_str); \ RAW_LOG(FATAL, err_str); \
return; \ return; \
} \ } \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Succ regist factory: %s->%s, tag: %s in macro!", #D, #B, N); \ ERROR_STRING_LEN - 1, \
"Succ regist factory: %s->%s, tag: %s in macro!", \
#D, \
#B, \
N); \
RAW_LOG(WARNING, err_str); \ RAW_LOG(WARNING, err_str); \
return; \ return; \
} }
...@@ -115,8 +128,10 @@ class FactoryPool { ...@@ -115,8 +128,10 @@ class FactoryPool {
typename std::map<std::string, FactoryBase<B>*>::iterator it = typename std::map<std::string, FactoryBase<B>*>::iterator it =
_pool.find(tag); _pool.find(tag);
if (it != _pool.end()) { if (it != _pool.end()) {
snprintf(err_str, ERROR_STRING_LEN - 1, snprintf(err_str,
"Insert duplicate with tag: %s", tag.c_str()); ERROR_STRING_LEN - 1,
"Insert duplicate with tag: %s",
tag.c_str());
RAW_LOG(FATAL, err_str); RAW_LOG(FATAL, err_str);
return -1; return -1;
} }
...@@ -124,15 +139,19 @@ class FactoryPool { ...@@ -124,15 +139,19 @@ class FactoryPool {
std::pair<typename std::map<std::string, FactoryBase<B>*>::iterator, bool> std::pair<typename std::map<std::string, FactoryBase<B>*>::iterator, bool>
r = _pool.insert(std::make_pair(tag, factory)); r = _pool.insert(std::make_pair(tag, factory));
if (!r.second) { if (!r.second) {
snprintf(err_str, ERROR_STRING_LEN - 1, snprintf(err_str,
"Failed insert new factory with: %s", tag.c_str()); ERROR_STRING_LEN - 1,
"Failed insert new factory with: %s",
tag.c_str());
RAW_LOG(FATAL, err_str); RAW_LOG(FATAL, err_str);
return -1; return -1;
} }
snprintf(err_str, ERROR_STRING_LEN - 1, snprintf(err_str,
"Succ insert one factory, tag: %s, base type %s", tag.c_str(), ERROR_STRING_LEN - 1,
typeid(B).name()); "Succ insert one factory, tag: %s, base type %s",
tag.c_str(),
typeid(B).name());
RAW_LOG(INFO, err_str); RAW_LOG(INFO, err_str);
return 0; return 0;
} }
...@@ -142,9 +161,11 @@ class FactoryPool { ...@@ -142,9 +161,11 @@ class FactoryPool {
_pool.find(tag); _pool.find(tag);
if (it == _pool.end() || it->second == NULL) { if (it == _pool.end() || it->second == NULL) {
char err_str[ERROR_STRING_LEN]; char err_str[ERROR_STRING_LEN];
snprintf(err_str, ERROR_STRING_LEN - 1, snprintf(err_str,
"Not found factory pool, tag: %s, pool size %u", tag.c_str(), ERROR_STRING_LEN - 1,
_pool.size()); "Not found factory pool, tag: %s, pool size %u",
tag.c_str(),
_pool.size());
RAW_LOG(FATAL, err_str); RAW_LOG(FATAL, err_str);
return NULL; return NULL;
} }
......
...@@ -63,8 +63,8 @@ class OpRepository { ...@@ -63,8 +63,8 @@ class OpRepository {
void regist_op(std::string op_type) { void regist_op(std::string op_type) {
_repository[op_type] = &OpFactory<OP_TYPE>::instance(); _repository[op_type] = &OpFactory<OP_TYPE>::instance();
char err_str[ERROR_STRING_LEN]; char err_str[ERROR_STRING_LEN];
snprintf(err_str, ERROR_STRING_LEN - 1, "Succ regist op: %s", snprintf(
op_type.c_str()); err_str, ERROR_STRING_LEN - 1, "Succ regist op: %s", op_type.c_str());
RAW_LOG(INFO, err_str); RAW_LOG(INFO, err_str);
} }
......
...@@ -21,23 +21,27 @@ namespace baidu { ...@@ -21,23 +21,27 @@ namespace baidu {
namespace paddle_serving { namespace paddle_serving {
namespace predictor { namespace predictor {
#define REGIST_FORMAT_SERVICE(svr_name, svr) \ #define REGIST_FORMAT_SERVICE(svr_name, svr) \
do { \ do { \
char err_str[ERROR_STRING_LEN]; \ char err_str[ERROR_STRING_LEN]; \
int ret = \ int ret = \
::baidu::paddle_serving::predictor::FormatServiceManager::instance() \ ::baidu::paddle_serving::predictor::FormatServiceManager::instance() \
.regist_service(svr_name, svr); \ .regist_service(svr_name, svr); \
if (ret != 0) { \ if (ret != 0) { \
snprintf(err_str, ERROR_STRING_LEN - 1, "Failed regist service[%s][%s]", \ snprintf(err_str, \
svr_name.c_str(), \ ERROR_STRING_LEN - 1, \
typeid(svr).name()); \ "Failed regist service[%s][%s]", \
RAW_LOG(ERROR, err_str); \ svr_name.c_str(), \
} else { \ typeid(svr).name()); \
snprintf(err_str, ERROR_STRING_LEN - 1, "Success regist service[%s][%s]", \ RAW_LOG(ERROR, err_str); \
svr_name.c_str(), \ } else { \
typeid(svr).name()); \ snprintf(err_str, \
RAW_LOG(INFO, err_str); \ ERROR_STRING_LEN - 1, \
} \ "Success regist service[%s][%s]", \
svr_name.c_str(), \
typeid(svr).name()); \
RAW_LOG(INFO, err_str); \
} \
} while (0) } while (0)
class FormatServiceManager { class FormatServiceManager {
...@@ -47,9 +51,11 @@ class FormatServiceManager { ...@@ -47,9 +51,11 @@ class FormatServiceManager {
int regist_service(const std::string& svr_name, Service* svr) { int regist_service(const std::string& svr_name, Service* svr) {
char err_str[ERROR_STRING_LEN]; char err_str[ERROR_STRING_LEN];
if (_service_map.find(svr_name) != _service_map.end()) { if (_service_map.find(svr_name) != _service_map.end()) {
snprintf(err_str, ERROR_STRING_LEN - 1, "Service[%s][%s] already exist!", snprintf(err_str,
svr_name.c_str(), ERROR_STRING_LEN - 1,
typeid(svr).name()); "Service[%s][%s] already exist!",
svr_name.c_str(),
typeid(svr).name());
RAW_LOG(ERROR, err_str); RAW_LOG(ERROR, err_str);
return -1; return -1;
} }
...@@ -57,15 +63,19 @@ class FormatServiceManager { ...@@ -57,15 +63,19 @@ class FormatServiceManager {
std::pair<boost::unordered_map<std::string, Service*>::iterator, bool> ret; std::pair<boost::unordered_map<std::string, Service*>::iterator, bool> ret;
ret = _service_map.insert(std::make_pair(svr_name, svr)); ret = _service_map.insert(std::make_pair(svr_name, svr));
if (ret.second == false) { if (ret.second == false) {
snprintf(err_str, ERROR_STRING_LEN - 1, "Service[%s][%s] insert failed!", snprintf(err_str,
svr_name.c_str(), ERROR_STRING_LEN - 1,
typeid(svr).name()); "Service[%s][%s] insert failed!",
svr_name.c_str(),
typeid(svr).name());
RAW_LOG(ERROR, err_str); RAW_LOG(ERROR, err_str);
return -1; return -1;
} }
snprintf(err_str, ERROR_STRING_LEN - 1, "Service[%s] insert successfully!", snprintf(err_str,
svr_name.c_str()); ERROR_STRING_LEN - 1,
"Service[%s] insert successfully!",
svr_name.c_str());
RAW_LOG(INFO, err_str); RAW_LOG(INFO, err_str);
return 0; return 0;
} }
...@@ -74,8 +84,10 @@ class FormatServiceManager { ...@@ -74,8 +84,10 @@ class FormatServiceManager {
char err_str[ERROR_STRING_LEN]; char err_str[ERROR_STRING_LEN];
boost::unordered_map<std::string, Service*>::iterator res; boost::unordered_map<std::string, Service*>::iterator res;
if ((res = _service_map.find(svr_name)) == _service_map.end()) { if ((res = _service_map.find(svr_name)) == _service_map.end()) {
snprintf(err_str, ERROR_STRING_LEN - 1, snprintf(err_str,
"Service[%s] not found in service manager!", svr_name.c_str()); ERROR_STRING_LEN - 1,
"Service[%s] not found in service manager!",
svr_name.c_str());
RAW_LOG(WARNING, err_str); RAW_LOG(WARNING, err_str);
return NULL; return NULL;
} }
......
...@@ -50,8 +50,8 @@ class WeightedRandomRender : public EndpointRouterBase { ...@@ -50,8 +50,8 @@ class WeightedRandomRender : public EndpointRouterBase {
Factory<WeightedRandomRender, EndpointRouterBase>* factory = Factory<WeightedRandomRender, EndpointRouterBase>* factory =
new (std::nothrow) Factory<WeightedRandomRender, EndpointRouterBase>(); new (std::nothrow) Factory<WeightedRandomRender, EndpointRouterBase>();
if (factory == NULL) { if (factory == NULL) {
RAW_LOG(ERROR, RAW_LOG(ERROR,
"Failed regist factory: WeightedRandomRender->EndpointRouterBase \ "Failed regist factory: WeightedRandomRender->EndpointRouterBase \
in macro!"); in macro!");
return -1; return -1;
} }
...@@ -62,7 +62,8 @@ class WeightedRandomRender : public EndpointRouterBase { ...@@ -62,7 +62,8 @@ class WeightedRandomRender : public EndpointRouterBase {
// together. // together.
if (FactoryPool<EndpointRouterBase>::instance().register_factory( if (FactoryPool<EndpointRouterBase>::instance().register_factory(
"WeightedRandomRender", factory) != 0) { "WeightedRandomRender", factory) != 0) {
RAW_LOG(INFO, "Factory has been registed: \ RAW_LOG(INFO,
"Factory has been registed: \
WeightedRandomRender->EndpointRouterBase."); WeightedRandomRender->EndpointRouterBase.");
} }
......
...@@ -29,31 +29,36 @@ namespace brpc = baidu::rpc; ...@@ -29,31 +29,36 @@ namespace brpc = baidu::rpc;
#define ERROR_STRING_LEN 10240 #define ERROR_STRING_LEN 10240
#define INLINE_REGIST_OBJECT(D, B, E) \ #define INLINE_REGIST_OBJECT(D, B, E) \
do { \ do { \
Factory<D, B>* factory = new (std::nothrow) Factory<D, B>(); \ Factory<D, B>* factory = new (std::nothrow) Factory<D, B>(); \
if (factory == NULL || \ if (factory == NULL || \
FactoryPool<B>::instance().register_factory(#D, factory) != 0) {\ FactoryPool<B>::instance().register_factory(#D, factory) != 0) { \
char err_str[ERROR_STRING_LEN]; \ char err_str[ERROR_STRING_LEN]; \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Failed regist factory: %s->%s in macro!", #D, #B); \ ERROR_STRING_LEN - 1, \
RAW_LOG(ERROR, err_str); \ "Failed regist factory: %s->%s in macro!", \
return E; \ #D, \
} \ #B); \
RAW_LOG(ERROR, err_str); \
return E; \
} \
} while (0) } while (0)
#define DECLARE_FACTORY_OBJECT(D, B) \ #define DECLARE_FACTORY_OBJECT(D, B) \
static int regist(const std::string& tag) { \ static int regist(const std::string& tag) { \
Factory<D, B>* factory = new (std::nothrow) Factory<D, B>(); \ Factory<D, B>* factory = new (std::nothrow) Factory<D, B>(); \
if (factory == NULL || \ if (factory == NULL || \
FactoryPool<B>::instance().register_factory(tag, factory) != 0) { \ FactoryPool<B>::instance().register_factory(tag, factory) != 0) { \
char err_str[ERROR_STRING_LEN]; \ char err_str[ERROR_STRING_LEN]; \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Failed regist factory: %s in macro!", #D); \ ERROR_STRING_LEN - 1, \
RAW_LOG(ERROR, err_str); \ "Failed regist factory: %s in macro!", \
return -1; \ #D); \
} \ RAW_LOG(ERROR, err_str); \
return 0; \ return -1; \
} \
return 0; \
} }
#define PDS_STR_CAT(a, b) PDS_STR_CAT_I(a, b) #define PDS_STR_CAT(a, b) PDS_STR_CAT_I(a, b)
...@@ -65,39 +70,46 @@ namespace brpc = baidu::rpc; ...@@ -65,39 +70,46 @@ namespace brpc = baidu::rpc;
D::regist(#D); \ D::regist(#D); \
} }
#define REGIST_FACTORY_OBJECT_IMPL(D, B) \ #define REGIST_FACTORY_OBJECT_IMPL(D, B) \
__attribute__((constructor)) static void PDS_STR_CAT(GlobalRegistObject, \ __attribute__((constructor)) static void PDS_STR_CAT(GlobalRegistObject, \
__LINE__)(void) { \ __LINE__)(void) { \
::baidu::paddle_serving::sdk_cpp::Factory<D, B>* factory = \ ::baidu::paddle_serving::sdk_cpp::Factory<D, B>* factory = \
new (::std::nothrow)::baidu::paddle_serving::sdk_cpp::Factory<D, B>();\ new (::std::nothrow)::baidu::paddle_serving::sdk_cpp::Factory<D, B>(); \
if (factory == NULL || \ if (factory == NULL || \
::baidu::paddle_serving::sdk_cpp::FactoryPool<B>::instance() \ ::baidu::paddle_serving::sdk_cpp::FactoryPool<B>::instance() \
.register_factory(#D, factory) != 0) { \ .register_factory(#D, factory) != 0) { \
char err_str[ERROR_STRING_LEN]; \ char err_str[ERROR_STRING_LEN]; \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Failed regist factory: %s->%s in macro!", #D, #B); \ ERROR_STRING_LEN - 1, \
RAW_LOG(ERROR, err_str); \ "Failed regist factory: %s->%s in macro!", \
return; \ #D, \
} \ #B); \
return; \ RAW_LOG(ERROR, err_str); \
return; \
} \
return; \
} }
#define REGIST_FACTORY_OBJECT_IMPL_WITH_TAG(D, B, T) \ #define REGIST_FACTORY_OBJECT_IMPL_WITH_TAG(D, B, T) \
__attribute__((constructor)) static void PDS_STR_CAT(GlobalRegistObject, \ __attribute__((constructor)) static void PDS_STR_CAT(GlobalRegistObject, \
__LINE__)(void) { \ __LINE__)(void) { \
::baidu::paddle_serving::sdk_cpp::Factory<D, B>* factory = \ ::baidu::paddle_serving::sdk_cpp::Factory<D, B>* factory = \
new (::std::nothrow)::baidu::paddle_serving::sdk_cpp::Factory<D, B>();\ new (::std::nothrow)::baidu::paddle_serving::sdk_cpp::Factory<D, B>(); \
if (factory == NULL || \ if (factory == NULL || \
::baidu::paddle_serving::sdk_cpp::FactoryPool<B>::instance() \ ::baidu::paddle_serving::sdk_cpp::FactoryPool<B>::instance() \
.register_factory(T, factory) != 0) { \ .register_factory(T, factory) != 0) { \
char err_str[ERROR_STRING_LEN]; \ char err_str[ERROR_STRING_LEN]; \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Failed regist factory: %s->%s, tag %s in macro!", #D, #B, T); \ ERROR_STRING_LEN - 1, \
RAW_LOG(ERROR, err_str); \ "Failed regist factory: %s->%s, tag %s in macro!", \
return; \ #D, \
} \ #B, \
return; \ T); \
} RAW_LOG(ERROR, err_str); \
return; \
} \
return; \
}
#define REGIST_ABTEST_OBJECT(D) \ #define REGIST_ABTEST_OBJECT(D) \
REGIST_FACTORY_OBJECT_IMPL( \ REGIST_FACTORY_OBJECT_IMPL( \
...@@ -107,26 +119,29 @@ namespace brpc = baidu::rpc; ...@@ -107,26 +119,29 @@ namespace brpc = baidu::rpc;
REGIST_FACTORY_OBJECT_IMPL_WITH_TAG( \ REGIST_FACTORY_OBJECT_IMPL_WITH_TAG( \
D, ::baidu::paddle_serving::sdk_cpp::ABTestRouterBase, T) D, ::baidu::paddle_serving::sdk_cpp::ABTestRouterBase, T)
#define REGIST_STUB_OBJECT_WITH_TAG(D, C, R, I, O, T) \ #define REGIST_STUB_OBJECT_WITH_TAG(D, C, R, I, O, T) \
__attribute__((constructor)) static void PDS_STR_CAT(GlobalRegistObject, \ __attribute__((constructor)) static void PDS_STR_CAT(GlobalRegistObject, \
__LINE__)(void) { \ __LINE__)(void) { \
::baidu::paddle_serving::sdk_cpp::Factory< \ ::baidu::paddle_serving::sdk_cpp::Factory< \
::baidu::paddle_serving::sdk_cpp::StubImpl<D, C, R, I, O>, \ ::baidu::paddle_serving::sdk_cpp::StubImpl<D, C, R, I, O>, \
::baidu::paddle_serving::sdk_cpp::Stub>* factory = \ ::baidu::paddle_serving::sdk_cpp::Stub>* factory = \
new (::std::nothrow)::baidu::paddle_serving::sdk_cpp::Factory< \ new (::std::nothrow)::baidu::paddle_serving::sdk_cpp::Factory< \
::baidu::paddle_serving::sdk_cpp::StubImpl<D, C, R, I, O>, \ ::baidu::paddle_serving::sdk_cpp::StubImpl<D, C, R, I, O>, \
::baidu::paddle_serving::sdk_cpp::Stub>(); \ ::baidu::paddle_serving::sdk_cpp::Stub>(); \
if (factory == NULL || \ if (factory == NULL || \
::baidu::paddle_serving::sdk_cpp::FactoryPool< \ ::baidu::paddle_serving::sdk_cpp::FactoryPool< \
::baidu::paddle_serving::sdk_cpp::Stub>::instance() \ ::baidu::paddle_serving::sdk_cpp::Stub>::instance() \
.register_factory(T, factory) != 0) { \ .register_factory(T, factory) != 0) { \
char err_str[ERROR_STRING_LEN]; \ char err_str[ERROR_STRING_LEN]; \
snprintf(err_str, ERROR_STRING_LEN - 1, \ snprintf(err_str, \
"Failed regist factory: %s->Stub, tag: %s in macro!", #D, T); \ ERROR_STRING_LEN - 1, \
RAW_LOG(ERROR, err_str); \ "Failed regist factory: %s->Stub, tag: %s in macro!", \
return; \ #D, \
} \ T); \
return; \ RAW_LOG(ERROR, err_str); \
return; \
} \
return; \
} }
class Stub; class Stub;
...@@ -161,8 +176,10 @@ class FactoryPool { ...@@ -161,8 +176,10 @@ class FactoryPool {
_pool.find(tag); _pool.find(tag);
if (it != _pool.end()) { if (it != _pool.end()) {
char err_str[ERROR_STRING_LEN]; char err_str[ERROR_STRING_LEN];
snprintf(err_str, ERROR_STRING_LEN - 1, snprintf(err_str,
"Insert duplicate with tag: %s", tag.c_str()); ERROR_STRING_LEN - 1,
"Insert duplicate with tag: %s",
tag.c_str());
RAW_LOG(ERROR, err_str); RAW_LOG(ERROR, err_str);
return -1; return -1;
} }
...@@ -171,8 +188,10 @@ class FactoryPool { ...@@ -171,8 +188,10 @@ class FactoryPool {
r = _pool.insert(std::make_pair(tag, factory)); r = _pool.insert(std::make_pair(tag, factory));
if (!r.second) { if (!r.second) {
char err_str[ERROR_STRING_LEN]; char err_str[ERROR_STRING_LEN];
snprintf(err_str, ERROR_STRING_LEN - 1, snprintf(err_str,
"Failed insert new factory with: %s", tag.c_str()); ERROR_STRING_LEN - 1,
"Failed insert new factory with: %s",
tag.c_str());
RAW_LOG(ERROR, err_str); RAW_LOG(ERROR, err_str);
return -1; return -1;
} }
...@@ -185,9 +204,11 @@ class FactoryPool { ...@@ -185,9 +204,11 @@ class FactoryPool {
_pool.find(tag); _pool.find(tag);
if (it == _pool.end() || it->second == NULL) { if (it == _pool.end() || it->second == NULL) {
char err_str[ERROR_STRING_LEN]; char err_str[ERROR_STRING_LEN];
snprintf(err_str, ERROR_STRING_LEN - 1, snprintf(err_str,
"Not found factory pool, tag: %s, pool size: %u", ERROR_STRING_LEN - 1,
tag.c_str(), _pool.size()); "Not found factory pool, tag: %s, pool size: %u",
tag.c_str(),
_pool.size());
RAW_LOG(ERROR, err_str); RAW_LOG(ERROR, err_str);
return NULL; return NULL;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册