示例#1
0
void MasterDBRMNode::run()
{
	ByteStream msg;
	IOSocket *s;
	boost::thread *reader;

	CLEAR_ALARM

	while (!die) {
		s = new IOSocket();
#ifdef BRM_VERBOSE
		cerr << "DBRM Controller waiting..." << endl;
#endif
		serverLock.lock();
		if (dbrmServer != NULL)
			try {
				*s = dbrmServer->accept(&MSG_TIMEOUT);
			}
			catch (runtime_error &e) {
				cerr << e.what() << " continuing...\n";
				serverLock.unlock();
				delete s;
				continue;
			}
		serverLock.unlock();

		if (reloadCmd) {
			if (s->isOpen())
				s->close();
			delete s;
			reload();
			continue;
		}

		if (die || !s->isOpen()) {
			if (s->isOpen())
				s->close();
			delete s;
			continue;
		}

#ifdef BRM_VERBOSE
		cerr << "DBRM Controller: got a connection..." << endl;
#endif
 		mutex.lock();
		activeSessions.push_back(s);
		params = new ThreadParams();
#ifdef BRM_VERBOSE
		cerr << "DBRM Controller: starting another thread" << endl;
#endif
		mutex2.lock();
		
		try {
			reader = new boost::thread(MsgProcessor(this));
		}
		catch (boost::thread_resource_error&) {
			log("DBRM Controller: WARNING!!  Got thread resource error!  Increase system stack size or decrease the # of active sessions.");
#ifdef BRM_VERBOSE
			cerr << "DBRM Controller: WARNING!!  Got thread resource error!  Increase system stack size or decrease the # of active sessions.\n";
#endif
			activeSessions.pop_back();
			sendError(s, ERR_NETWORK);
			sleep(1);  // don't close right away to avoid broken pipe on the client
			s->close();
			delete s;
			delete params;
			mutex2.unlock();
			mutex.unlock();
			continue;
		}
	
		params->t = reader;
		params->sock = s;
		mutex2.unlock();
#ifdef __FreeBSD__
		mutex.unlock();
#endif
	}
	serverLock.lock();
	delete dbrmServer;
	dbrmServer = NULL;
	serverLock.unlock();
}