in nlsCppSdk/transport/connectNode.cpp [3723:3811]
void ConnectNode::delAllEvents() {
LOG_DEBUG(
"Node(%p) delete all events begin, current node status:%s exit "
"status:%s.",
this, getConnectNodeStatusString().c_str(),
getExitStatusString().c_str());
/* 当Node处于Invoking状态, 即还未进入正式运行,
* 需要等待其进入Invoked才可进行操作 */
int try_count = 2000;
while (_workStatus == NodeInvoking && try_count-- > 0) {
#ifdef _MSC_VER
Sleep(1);
#else
usleep(1000);
#endif
}
if (try_count <= 0) {
LOG_WARN("Node(%p) waiting exit NodeInvoking failed.", this);
} else {
LOG_DEBUG("Node(%p) waiting exit NodeInvoking success.", this);
}
/* 当Node处于异步dns线程状态, 通知线程退出并等待其退出再进行释放 */
if (_url._enableSysGetAddr && _dnsThreadRunning) {
_dnsThreadExit = true;
try_count = 5000;
LOG_WARN("Node(%p) waiting exit dnsThread ...", this);
while (_dnsThreadRunning && try_count-- > 0) {
#ifdef _MSC_VER
Sleep(1);
#else
usleep(1000);
#endif
}
if (try_count <= 0) {
LOG_WARN("Node(%p) waiting exit dnsThread failed.", this);
} else {
LOG_WARN("Node(%p) waiting exit dnsThread success.", this);
}
}
waitEventCallback();
bool del_all_events_lock_ret = true;
MUTEX_TRY_LOCK(_mtxCloseNode, 2000, del_all_events_lock_ret);
if (!del_all_events_lock_ret) {
LOG_ERROR("Node(%p) delAllEvents, deadlock has occurred", this);
}
if (_dnsEvent) {
event_del(_dnsEvent);
event_free(_dnsEvent);
_dnsEvent = NULL;
}
if (_readEvent) {
event_del(_readEvent);
event_free(_readEvent);
_readEvent = NULL;
}
if (_writeEvent) {
event_del(_writeEvent);
event_free(_writeEvent);
_writeEvent = NULL;
}
if (_connectEvent) {
event_del(_connectEvent);
event_free(_connectEvent);
_connectEvent = NULL;
}
#ifdef ENABLE_HIGH_EFFICIENCY
if (_connectTimerEvent != NULL) {
if (_connectTimerFlag) {
evtimer_del(_connectTimerEvent);
_connectTimerFlag = false;
}
event_free(_connectTimerEvent);
_connectTimerEvent = NULL;
}
#endif
if (del_all_events_lock_ret) {
MUTEX_UNLOCK(_mtxCloseNode);
}
waitEventCallback();
LOG_DEBUG("Node(%p) delete all events done.", this);
}