void Schedule(const char * name, task_fn fn, uint32_t threadid) { BASIS_ASSERT(Scheduler != nullptr); if (threadid >=0 && threadid < ThreadCount) { scheduler_data * s = SchedulerList + threadid; s->privateTasks.push_back<task_entry>({ fn, basis::stralloc(name) }); s->privateTaskCount.fetch_add(1, std::memory_order_relaxed); if (s != Scheduler) { SignalScheduler(s); } } else { BASIS_ASSERT(threadid == TACO_INVALID_THREAD_ID); Scheduler->sharedTasks.push_back<task_entry>({ fn, basis::stralloc(name) }); uint32_t count = GlobalSharedTaskCount.fetch_add(1, std::memory_order_relaxed) + 1; if (count > 1 || !Scheduler->isActive) { AskForHelp(count); } } }
int ConnMgr::Start() { m_Lucky = -1; static int timeout = 0; //自动机 int iStatus = -1; switch(m_status){ case STA_CON: if(SUCCESS_RET == m_ProtocolHelper->Connect()){ m_status = STA_CON_OK; } else{ m_ProtocolHelper->CleanUp(); m_status = STA_CON; } break; case STA_CON_OK: iStatus = m_ProtocolHelper->CheckCONReply(); if(CHK_SUCCESS == iStatus){ m_status = STA_MAC; timeout=-1; } else if(CHK_FAIL == iStatus || timeout > MAXTRY){ m_ProtocolHelper->CleanUp(); m_status = STA_CON; timeout=-1; } timeout++; break; case STA_MAC: iStatus = m_ProtocolHelper->SendMACAddress(); if(SUCCESS_RET == iStatus){ m_status = STA_MAC_OK; } else{ m_ProtocolHelper->CleanUp(); m_status = STA_CON; } break; case STA_MAC_OK: iStatus = m_ProtocolHelper->CheckMACReply(); if(CHK_SUCCESS == iStatus){ m_status = STA_NAT; timeout = -1; } else if(CHK_FAIL == iStatus || timeout > MAXTRY){ if(CHK_FAIL == iStatus) AskForHelp(_T("你的MAC地址好像不对耶?")); else if( timeout > MAXTRY) AskForHelp(_T("连接超时了~")); m_ProtocolHelper->CleanUp(); timeout = -1; m_status = STA_CON; } timeout++; break; case STA_NAT: iStatus = m_ProtocolHelper->SendNATVersion(); if(SUCCESS_RET == iStatus){ m_status = STA_NAT_OK; } else{ m_ProtocolHelper->CleanUp(); m_status = STA_CON; } break; case STA_NAT_OK: iStatus = m_ProtocolHelper->CheckNATReply(); if(CHK_SUCCESS == iStatus){ m_status = STA_INF; timeout = -1; } else if(CHK_FAIL == iStatus || timeout > MAXTRY){ m_ProtocolHelper->CleanUp(); m_status = STA_CON; timeout = -1; } timeout++; break; case STA_INF: iStatus = m_ProtocolHelper->SendInformation(); if(SUCCESS_RET == iStatus){ m_status = STA_INF_OK; } else{ m_ProtocolHelper->CleanUp(); m_status = STA_CON; } break; case STA_INF_OK: iStatus = m_ProtocolHelper->CheckINFReply(); if(CHK_SUCCESS == iStatus){ m_status = STA_CHK; timeout = -1; } else if(CHK_FAIL == iStatus || timeout > MAXTRY){ if(CHK_FAIL == iStatus) AskForHelp(_T("看看你的用户名密码是不是写错了? 还有套餐选对没?")); else if( timeout > MAXTRY) AskForHelp(_T("连接超时了~")); m_ProtocolHelper->CleanUp(); m_status = STA_CON; timeout = -1; } timeout++; break; case STA_CHK: iStatus = m_ProtocolHelper->SendCheckNAT(); if(SUCCESS_RET == iStatus){ m_status = STA_CHK_OK; } else{ m_ProtocolHelper->CleanUp(); m_status = STA_CON; } break; case STA_CHK_OK: iStatus = m_ProtocolHelper->CheckCHKReply(); if(CHK_SUCCESS == iStatus){ g_Status = ONLINE; onStatusChange(); SetRouteTable(); timeout = -1; m_status = STA_CON; } else if(CHK_FAIL == iStatus || timeout > MAXTRY){ m_ProtocolHelper->CleanUp(); timeout = -1; m_status = STA_CON; } timeout++; break; } return 0; }