Carbon loop not ready within 5 sec #4002

Port fix from enterprise.
This commit is contained in:
Xinyu Hou 2014-10-21 15:48:04 +01:00
parent 70c8f98615
commit 504e41966e
1 changed files with 27 additions and 3 deletions

View File

@ -62,6 +62,10 @@ enum {
kSynergyMouseScrollAxisY = 'saxy' kSynergyMouseScrollAxisY = 'saxy'
}; };
enum {
kCarbonLoopWaitTimeout = 10
};
// TODO: upgrade deprecated function usage in these functions. // TODO: upgrade deprecated function usage in these functions.
void setZeroSuppressionInterval(); void setZeroSuppressionInterval();
void avoidSupression(); void avoidSupression();
@ -1693,17 +1697,24 @@ COSXScreen::watchSystemPowerThread(void*)
// setting m_pmThreadReady to true otherwise the parent thread will // setting m_pmThreadReady to true otherwise the parent thread will
// block waiting for it. // block waiting for it.
if (m_pmRootPort == 0) { if (m_pmRootPort == 0) {
LOG((CLOG_WARN "failed to init watchSystemPowerThread"));
return; return;
} }
LOG((CLOG_DEBUG "started watchSystemPowerThread")); LOG((CLOG_DEBUG "started watchSystemPowerThread"));
LOG((CLOG_DEBUG "waiting for event loop"));
m_events->waitForReady(); m_events->waitForReady();
#if defined(MAC_OS_X_VERSION_10_7) #if defined(MAC_OS_X_VERSION_10_7)
{ {
CLock lockCarbon(m_carbonLoopMutex); CLock lockCarbon(m_carbonLoopMutex);
if (*m_carbonLoopReady == false) { if (*m_carbonLoopReady == false) {
// we signalling carbon loop ready before starting
// unless we know how to do it within the loop
LOG((CLOG_DEBUG "signalling carbon loop ready"));
*m_carbonLoopReady = true; *m_carbonLoopReady = true;
m_carbonLoopReady->signal(); m_carbonLoopReady->signal();
} }
@ -1713,6 +1724,7 @@ COSXScreen::watchSystemPowerThread(void*)
// start the run loop // start the run loop
LOG((CLOG_DEBUG "starting carbon loop")); LOG((CLOG_DEBUG "starting carbon loop"));
CFRunLoopRun(); CFRunLoopRun();
LOG((CLOG_DEBUG "carbon loop has stopped"));
// cleanup // cleanup
if (notificationPortRef) { if (notificationPortRef) {
@ -2126,14 +2138,26 @@ void
COSXScreen::waitForCarbonLoop() const COSXScreen::waitForCarbonLoop() const
{ {
#if defined(MAC_OS_X_VERSION_10_7) #if defined(MAC_OS_X_VERSION_10_7)
double timeout = ARCH->time() + 10; if (*m_carbonLoopReady) {
LOG((CLOG_DEBUG "carbon loop already ready"));
return;
}
CLock lock(m_carbonLoopMutex); CLock lock(m_carbonLoopMutex);
LOG((CLOG_DEBUG "waiting for carbon loop"));
double timeout = ARCH->time() + kCarbonLoopWaitTimeout;
while (!m_carbonLoopReady->wait()) { while (!m_carbonLoopReady->wait()) {
if(ARCH->time() > timeout) { if(ARCH->time() > timeout) {
throw std::runtime_error("carbon loop is not ready within 5 sec"); LOG((CLOG_DEBUG "carbon loop not ready, waiting again"));
timeout = ARCH->time() + kCarbonLoopWaitTimeout;
} }
} }
LOG((CLOG_DEBUG "carbon loop ready"));
#endif #endif
} }
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" #pragma GCC diagnostic ignored "-Wdeprecated-declarations"