in nlsCppSdk/transport/nlsEventNetWork.cpp [395:490]
int NlsEventNetWork::startInner(INlsRequest *request) {
MUTEX_LOCK(_mtxThread);
if (_eventClient == NULL) {
LOG_ERROR(
"NlsEventNetWork has destroyed, please invoke startWorkThread() "
"first.");
MUTEX_UNLOCK(_mtxThread);
return -(EventClientEmpty);
}
ConnectNode *node = request->getConnectNode();
if (node == NULL) {
LOG_ERROR("The node of request(%p) is nullptr, you have destroyed request!",
request);
MUTEX_UNLOCK(_mtxThread);
return -(NodeEmpty);
}
if (_preconnectedPool) {
node->usePreconnection(true);
node->useLongConnection(false);
} else {
node->usePreconnection(false);
}
/*
* invoke start
* Node处于刚创建完状态, 且处于非退出状态, 则可进行start操作.
*/
if (node->getConnectNodeStatus() == NodeCreated &&
node->getExitStatus() == ExitInvalid) {
node->setConnectNodeStatus(NodeInvoking);
#ifdef ENABLE_REQUEST_RECORDING
node->updateNodeProcess("start", NodeInvoking, true, 0);
#endif
int num = request->getThreadNumber();
if (num < 0) {
num = selectThreadNumber();
}
if (num < 0) {
node->setConnectNodeStatus(NodeCreated);
MUTEX_UNLOCK(_mtxThread);
#ifdef ENABLE_REQUEST_RECORDING
node->updateNodeProcess("start", NodeCreated, false, 0);
#endif
return -(SelectThreadFailed);
} else {
request->setThreadNumber(num);
}
LOG_DEBUG("Request(%p) Node(%p) select NO:%d Total:%d thread.", request,
node, num, _workThreadsNumber);
WorkThread *work_thread = &_workThreadArray[num];
node->setEventThread(work_thread);
node->getEventThread()->setInstance(_instance);
node->setInstance(_instance);
node->getEventThread()->setAddrInFamily(_addrInFamily);
if (strnlen(_directIp, 64) > 0) {
node->getEventThread()->setDirectHost(_directIp);
}
node->getEventThread()->setUseSysGetAddrInfo(_enableSysGetAddr);
node->setSyncCallTimeout(_syncCallTimeoutMs);
work_thread->updateParameters(node);
node->initNlsEncoder();
} else if (node->getExitStatus() == ExitInvalid &&
node->getConnectNodeStatus() > NodeCreated &&
node->getConnectNodeStatus() < NodeFailed) {
LOG_WARN(
"Request(%p) node(%p) has invoked start, node status:%s, exit "
"status:%s. skip ...",
request, node, node->getConnectNodeStatusString().c_str(),
node->getExitStatusString().c_str());
MUTEX_UNLOCK(_mtxThread);
return Success;
} else {
LOG_ERROR(
"Request(%p) node(%p) invoke start failed, current status is invalid. "
"node status:%s, exit status:%s.",
request, node, node->getConnectNodeStatusString().c_str(),
node->getExitStatusString().c_str());
node->setConnectNodeStatus(NodeCreated);
MUTEX_UNLOCK(_mtxThread);
return -(InvokeStartFailed);
}
MUTEX_UNLOCK(_mtxThread);
LOG_DEBUG("Request(%p) node(%p) invoke start success.", request, node);
return Success;
}