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