bool CServerApp::initServer() { // skip if already initialized or initializing if (s_serverState != kUninitialized) { return true; } double retryTime; CScreen* serverScreen = NULL; CPrimaryClient* primaryClient = NULL; try { CString name = args().m_config->getCanonicalName(args().m_name); serverScreen = openServerScreen(); primaryClient = openPrimaryClient(name, serverScreen); s_serverScreen = serverScreen; s_primaryClient = primaryClient; s_serverState = kInitialized; updateStatus(); return true; } catch (XScreenUnavailable& e) { LOG((CLOG_WARN "cannot open primary screen: %s", e.what())); closePrimaryClient(primaryClient); closeServerScreen(serverScreen); updateStatus(CString("cannot open primary screen: ") + e.what()); retryTime = e.getRetryTime(); } catch (XScreenOpenFailure& e) { LOG((CLOG_CRIT "cannot open primary screen: %s", e.what())); closePrimaryClient(primaryClient); closeServerScreen(serverScreen); return false; } catch (XBase& e) { LOG((CLOG_CRIT "failed to start server: %s", e.what())); closePrimaryClient(primaryClient); closeServerScreen(serverScreen); return false; } if (args().m_restartable) { // install a timer and handler to retry later assert(s_timer == NULL); LOG((CLOG_DEBUG "retry in %.0f seconds", retryTime)); s_timer = EVENTQUEUE->newOneShotTimer(retryTime, NULL); EVENTQUEUE->adoptHandler(CEvent::kTimer, s_timer, new TMethodEventJob<CServerApp>(this, &CServerApp::retryHandler)); s_serverState = kInitializing; return true; } else { // don't try again return false; } }
static bool startServer() { double retryTime; CScreen* serverScreen = NULL; CPrimaryClient* primaryClient = NULL; CClientListener* listener = NULL; try { CString name = ARG->m_config->getCanonicalName(ARG->m_name); serverScreen = openServerScreen(); primaryClient = openPrimaryClient(name, serverScreen); listener = openClientListener(ARG->m_config->getSynergyAddress()); s_server = openServer(*ARG->m_config, primaryClient); s_serverScreen = serverScreen; s_primaryClient = primaryClient; s_listener = listener; updateStatus(); LOG((CLOG_NOTE "started server")); return true; } catch (XScreenUnavailable& e) { LOG((CLOG_WARN "cannot open primary screen: %s", e.what())); closeClientListener(listener); closePrimaryClient(primaryClient); closeServerScreen(serverScreen); updateStatus(CString("cannot open primary screen: ") + e.what()); retryTime = e.getRetryTime(); } catch (XSocketAddressInUse& e) { LOG((CLOG_WARN "cannot listen for clients: %s", e.what())); closeClientListener(listener); closePrimaryClient(primaryClient); closeServerScreen(serverScreen); updateStatus(CString("cannot listen for clients: ") + e.what()); retryTime = 10.0; } catch (XScreenOpenFailure& e) { LOG((CLOG_CRIT "cannot open primary screen: %s", e.what())); closeClientListener(listener); closePrimaryClient(primaryClient); closeServerScreen(serverScreen); return false; } catch (XBase& e) { LOG((CLOG_CRIT "failed to start server: %s", e.what())); closeClientListener(listener); closePrimaryClient(primaryClient); closeServerScreen(serverScreen); return false; } if (ARG->m_restartable) { // install a timer and handler to retry later LOG((CLOG_DEBUG "retry in %.0f seconds", retryTime)); CEventQueueTimer* timer = EVENTQUEUE->newOneShotTimer(retryTime, NULL); EVENTQUEUE->adoptHandler(CEvent::kTimer, timer, new CFunctionEventJob(&retryStartHandler, timer)); return true; } else { // don't try again return false; } }