bool SocketServer::stopSessions(bool wait, unsigned wait_timeout){ int i; m_session_mutex.lock(); for(i = m_sessions.size() - 1; i>=0; i--) { m_sessions[i].m_session->stopSession(); } m_session_mutex.unlock(); for(i = m_services.size() - 1; i>=0; i--) m_services[i].m_service->stopSessions(); if(!wait) return false; // No wait const NDB_TICKS start = NdbTick_getCurrentTicks(); m_session_mutex.lock(); while(m_sessions.size() > 0){ checkSessionsImpl(); m_session_mutex.unlock(); if (wait_timeout > 0 && NdbTick_Elapsed(start,NdbTick_getCurrentTicks()).milliSec() > wait_timeout) return false; // Wait abandoned NdbSleep_MilliSleep(100); m_session_mutex.lock(); } m_session_mutex.unlock(); return true; // All sessions gone }
void SocketServer::checkSessions() { m_session_mutex.lock(); checkSessionsImpl(); m_session_mutex.unlock(); }
void SocketServer::foreachSession(void (*func)(SocketServer::Session*, void *), void *data) { // Build a list of pointers to all active sessions // and increase refcount on the sessions m_session_mutex.lock(); Vector<Session*> session_pointers(m_sessions.size()); for(unsigned i= 0; i < m_sessions.size(); i++){ Session* session= m_sessions[i].m_session; session_pointers.push_back(session); session->m_refCount++; } m_session_mutex.unlock(); // Call the function on each session for(unsigned i= 0; i < session_pointers.size(); i++){ (*func)(session_pointers[i], data); } // Release the sessions pointers and any stopped sessions m_session_mutex.lock(); for(unsigned i= 0; i < session_pointers.size(); i++){ Session* session= session_pointers[i]; assert(session->m_refCount > 0); session->m_refCount--; } checkSessionsImpl(); m_session_mutex.unlock(); }
void SocketServer::stopSessions(bool wait){ int i; m_session_mutex.lock(); for(i = m_sessions.size() - 1; i>=0; i--) { m_sessions[i].m_session->stopSession(); m_sessions[i].m_session->m_stop = true; // to make sure } m_session_mutex.unlock(); for(i = m_services.size() - 1; i>=0; i--) m_services[i].m_service->stopSessions(); if(wait){ m_session_mutex.lock(); while(m_sessions.size() > 0){ checkSessionsImpl(); m_session_mutex.unlock(); NdbSleep_MilliSleep(100); m_session_mutex.lock(); } m_session_mutex.unlock(); } }
void SocketServer::doRun(){ while(!m_stopThread){ m_session_mutex.lock(); checkSessionsImpl(); if(m_sessions.size() < m_maxSessions){ m_session_mutex.unlock(); doAccept(); } else { m_session_mutex.unlock(); NdbSleep_MilliSleep(200); } } }
void SocketServer::doRun(){ while(!m_stopThread){ m_session_mutex.lock(); checkSessionsImpl(); m_session_mutex.unlock(); if(m_sessions.size() >= m_maxSessions){ // Don't accept more connections yet NdbSleep_MilliSleep(200); continue; } if (!doAccept()){ // accept failed, step back NdbSleep_MilliSleep(200); } } }