void ConnectionSet::_addConnectionToThread( ConnectionPtr connection ) { _needRebalance = true; lunchbox::ScopedWrite mutex( _impl->lock ); if ( _impl->threads.size() > 0 ) { Thread* minThread = *( std::min_element(_impl->threads.begin(), _impl->threads.end(), ThreadConnectionsSizeComparator()) ); if ( minThread->set._impl->connections.size() < MAX_CONNECTIONS ) minThread->set.addConnection( connection ); else { Connections connections(1, connection); _createThread( connections ); } } else { _isThreadMode = true; size_t mid_connections = _impl->connections.size()/2; Connections connections1(_impl->connections.begin(), _impl->connections.begin() + mid_connections ); Connections connections2(_impl->connections.begin() + mid_connections, _impl->connections.end() ); connections1.push_back( connection ); while( !_impl->connections.empty() ) { ConnectionPtr lastConnection = _impl->connections.back(); lastConnection->removeListener( _impl ); _impl->connections.pop_back(); } _createThread( connections1 ); _createThread( connections2 ); } }
void cWorker::checkThreadAlive() { if (!CThread::checkThreadAlive(worker_thread_id)) { _createThread(); } }
void cWorker::run() { _createThread(); }