void ThreadedSocketAcceptor::onStop() { SocketToThread threads; SocketToThread::iterator i; { Locker l(m_mutex); time_t start = 0; time_t now = 0; ::time( &start ); while ( isLoggedOn() ) { if( ::time(&now) -5 >= start ) break; } threads = m_threads; m_threads.clear(); } for ( i = threads.begin(); i != threads.end(); ++i ) socket_close( i->first ); for ( i = threads.begin(); i != threads.end(); ++i ) thread_join( i->second ); }
void Initiator::stop( bool force ) { if( isStopped() ) return; HttpServer::stopGlobal(); std::vector<Session*> enabledSessions; SessionIDs connected = m_connected; SessionIDs::iterator i = connected.begin(); for ( ; i != connected.end(); ++i ) { Session* pSession = Session::lookupSession(*i); if( pSession && pSession->isEnabled() ) { enabledSessions.push_back( pSession ); pSession->logout(); } } if( !force ) { for ( int second = 1; second <= 10 && isLoggedOn(); ++second ) process_sleep( 1 ); } { Locker l(m_mutex); for ( i = connected.begin(); i != connected.end(); ++i ) setDisconnected( Session::lookupSession(*i)->getSessionID() ); } m_stop = true; onStop(); if( m_threadid ) thread_join( m_threadid ); m_threadid = 0; std::vector<Session*>::iterator session = enabledSessions.begin(); for( ; session != enabledSessions.end(); ++session ) (*session)->logon(); }
void SocketInitiator::onStart() { QF_STACK_PUSH(SocketInitiator::onStart) connect(); while ( !isStopped() ) m_connector.block( *this ); time_t start = 0; time_t now = 0; ::time( &start ); while ( isLoggedOn() ) { m_connector.block( *this ); if( ::time(&now) -5 >= start ) break; } QF_STACK_POP }
bool SocketInitiator::onPoll( double timeout ) { QF_STACK_PUSH(SocketInitiator::onPoll) time_t start = 0; time_t now = 0; if( isStopped() ) { if( start == 0 ) ::time( &start ); if( !isLoggedOn() ) return false; if( ::time(&now) - 5 >= start ) return false; } m_connector.block( *this, true, timeout ); return true; QF_STACK_POP }
void Acceptor::stop( bool force ) { if( isStopped() ) return; HttpServer::stopGlobal(); std::vector<Session*> tempSessions; Sessions sessions = m_sessions; Sessions::iterator i = sessions.begin(); for ( ; i != sessions.end(); ++i ) { Session* pSession = Session::lookupSession(i->first); if( pSession ) { tempSessions.push_back( pSession ); pSession->logout(); Session::unregisterSession( pSession->getSessionID() ); } } if( !force ) { for ( int second = 1; second <= 10 && isLoggedOn(); ++second ) process_sleep( 1 ); } m_stop = true; onStop(); if( m_threadid ) thread_join( m_threadid ); m_threadid = 0; /* why logon again? std::vector<Session*>::iterator session = tempSessions.begin(); for( ; session != tempSessions.end(); ++session ) (*session)->logon(); */ }