void ConnectNode::delAllEvents()

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);
}