bool CClientService::ConnectPipes () { LOGINFO (TEXT ("Connecting pipes to JVM")); m_oPipesSemaphore.Wait (); if (!m_poPipes) { m_oPipesSemaphore.Signal (); LOGFATAL (TEXT ("Pipes not created")); assert (0); return false; } if (!m_poJVM) { m_oPipesSemaphore.Signal (); LOGFATAL (TEXT ("JVM not created")); assert (0); return false; } CSettings oSettings; const TCHAR *pszPipeName = oSettings.GetConnectionPipe (); LOGDEBUG (TEXT ("Connecting to ") << pszPipeName); unsigned long lTimeout = m_poJVM->FirstConnection () ? oSettings.GetStartTimeout () : oSettings.GetConnectTimeout (); m_lSendTimeout = lTimeout; m_lShortTimeout = oSettings.GetSendTimeout (); unsigned long lTime = GetTickCount (); CNamedPipe *poPipe; do { poPipe = CNamedPipe::ClientWrite (pszPipeName); if (poPipe) { break; } else { int ec = GetLastError (); if (ec == ENOENT) { if (GetTickCount () - lTime > lTimeout) { m_oPipesSemaphore.Signal (); LOGWARN (TEXT ("Timeout waiting for JVM service to open ") << pszPipeName); return false; } else { if (m_poJVM->IsAlive ()) { LOGDEBUG (TEXT ("Waiting for JVM service to open pipe")); CThread::Sleep (oSettings.GetServicePoll ()); } else { m_oPipesSemaphore.Signal (); LOGWARN (TEXT ("JVM service terminated before opening ") << pszPipeName); return false; } } } else { m_oPipesSemaphore.Signal (); LOGWARN (TEXT ("Couldn't connect to ") << pszPipeName << TEXT (", error ") << ec); return false; } } } while (true); LOGDEBUG (TEXT ("Connected to service")); bool bResult = m_poPipes->Connect (m_pszLanguageID, poPipe, lTimeout); if (!bResult) { LOGWARN (TEXT ("Couldn't connect to JVM service, error ") << GetLastError ()); } delete poPipe; m_oPipesSemaphore.Signal (); return bResult; }
long CRequestBuilder::GetDefaultTimeout () { static long volatile s_lDefaultTimeout = 0; if (!s_lDefaultTimeout) { CSettings oSettings; s_lDefaultTimeout = oSettings.GetSendTimeout () * 2; } return s_lDefaultTimeout; }