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