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