void OsclSocketServI::ServerExit() //Server exit processing { //change state if this was a normal exit. if (iServState == OsclSocketServI::ESocketServ_Connected) { iServState = OsclSocketServI::ESocketServ_Idle; } //Go through the active requests one last time. //All the requests will complete with errors //since the server is no longer connected. #if PV_SOCKET_SERVER_SELECT int nfds; int nhandles = 0; ProcessSocketRequests(nhandles, nfds); #else ProcessSocketRequests(); #endif iSockServRequestList.Close(); //make sure sets are clear so resources get cleaned up. #if PV_SOCKET_SERVER_SELECT FD_ZERO(&iReadset); FD_ZERO(&iWriteset); FD_ZERO(&iExceptset); #endif }
void OsclSocketServI::ServerExit() //Server exit processing { //change state if this was a normal exit. if (iServState == OsclSocketServI::ESocketServ_Connected) { iServState = OsclSocketServI::ESocketServ_Idle; } #ifdef OsclSocketSelect //Go through the active requests one last time. //All the requests will complete with errors //since the server is no longer connected. bool doSelect; int nfds; ProcessSocketRequests(doSelect, nfds); iSockServRequestList.Close(); //make sure sets are clear so resources get cleaned up. FD_ZERO(&iReadset); FD_ZERO(&iWriteset); FD_ZERO(&iExceptset); #endif//OsclSocketSelect }
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(); } }