int32 OsclSocketServI::StartServImp() { #if(PV_SOCKET_SERVER_IS_THREAD) //setup the loopback socket and/or polling interval. iLoopbackSocket.iEnable = false; iSelectPollIntervalMsec = 0; //check the select timeout in the configuration. int32 selectTimeoutMsec = PV_SOCKET_SERVER_SELECT_TIMEOUT_MSEC; if (selectTimeoutMsec <= 0) { //non-polling option selected. //create the select cancel pipe. iLoopbackSocket.Init(this); //if loopback socket isn't available, we must poll. if (!iLoopbackSocket.iEnable) iSelectPollIntervalMsec = 10; } else { //polling option selected. iSelectPollIntervalMsec = selectTimeoutMsec; #if(PV_SOCKET_SERVER_SELECT_LOOPBACK_SOCKET) //create the loopback socket. iLoopbackSocket.Init(this); #endif } //Start the server thread. OsclThread thread; OsclProcStatus::eOsclProcError err = thread.Create((TOsclThreadFuncPtr)sockthreadmain, 1024, (TOsclThreadFuncArg)this); if (err != OsclErrNone) return OsclErrGeneral; thread.SetPriority(PV_SOCKET_SERVER_THREAD_PRIORITY); //wait til thread starts iStart.Wait(); return OsclErrNone; #else//PV_SOCKET_SERVER_IS_THREAD //Socket server AO startup. iLoopbackSocket.iEnable = false; ServerEntry(); if (!IsAdded()) { AddToScheduler(); } return OsclErrNone; #endif //PV_SOCKET_SERVER_IS_THREAD }
void OsclSocketServI::InThread() //Socket server thread implementation. { OsclThread::GetId(iThreadId); iClose = false; ServerEntry(); #ifndef OsclSocketSelect //no implementation! iServState = OsclSocketServI::ESocketServ_Error; iStart.Signal(); return; #else //Let server know thread is started and ready to //process requests. iStart.Signal(); //create select timeout structure timeval timeout; bool doSelect, ok; int nfds; int nhandles = 0; while (!iClose) { //process active requests. ProcessSocketRequests(doSelect, nfds); //Make the select call if needed. if (doSelect) { //Set the fixed timeout. The select call may update this value //so it needs to be set on each call. timeout.tv_sec = 0; if (iSelectPollIntervalMsec == 0) { //wait forever timeout.tv_usec = 0x1fffffff; } else { //poll timeout.tv_usec = iSelectPollIntervalMsec * 1000; } LOGSERV((0, "OsclSocketServI::InThread Calling select, timeout %d", iSelectPollIntervalMsec)); OsclSocketSelect(nfds, iReadset, iWriteset, iExceptset, timeout, ok, iServError, nhandles); LOGSERV((0, "OsclSocketServI::InThread Select call returned")); if (!ok) { //select error. iServState = OsclSocketServI::ESocketServ_Error; break; } if (nhandles) { ADD_STATS(EOsclSocketServ_SelectActivity); } else { ADD_STATS(EOsclSocketServ_SelectNoActivity); } } else { //wait on new requests from the app side. LOGSERV((0, "OsclSocketServI::InThread Waiting on requests")); iSockServRequestList.WaitOnRequests(); LOGSERV((0, "OsclSocketServI::InThread Done Waiting on requests")); } }//select loop ServerExit(); #endif //OsclSocketSelect //signal close complete to caller... if (iClose) { iClose = false; iExit.Signal(); } }
void UINodeServerSelector::addServer (const std::string &host, const std::string& name, const std::string& mapName, int port, int playerCount, int maxPlayerCount) { Log::info(LOG_UI, "add server: %s", host.c_str()); addData(ServerEntry(name, host, port, mapName, playerCount, maxPlayerCount)); }