Properly lock condVar, add timeout condition to prevent infinite loop when waiting for fillClipboard() to finish

This commit is contained in:
Nye Liu 2015-09-03 12:09:35 -07:00 committed by Xinyu Hou
parent 6c11de6a22
commit 0d310a8464
1 changed files with 12 additions and 2 deletions

View File

@ -283,8 +283,16 @@ Client::leave()
&Client::sendClipboardThread, &Client::sendClipboardThread,
NULL)); NULL));
// Bug #4735 - we can't leave() until fillClipboard()s all finish // Bug #4735 - we can't leave() until fillClipboard()s all finish
while (!m_condData) Stopwatch timer(true);
m_condVar->wait(); m_mutex->lock();
while (!m_condData) {
m_condVar->wait(timer, 0.5);
if (timer.getTime()>0.5) {
LOG((CLOG_DEBUG "timed out waiting for clipboard fill"));
break;
}
}
m_mutex->unlock();
m_screen->leave(); m_screen->leave();
@ -791,8 +799,10 @@ Client::sendClipboardThread(void * data)
} }
// signal that fill is done // signal that fill is done
m_mutex->lock();
m_condData = true; m_condData = true;
m_condVar->signal(); m_condVar->signal();
m_mutex->unlock();
// send clipboards that we own and that have changed // send clipboards that we own and that have changed
for (ClipboardID id = 0; id < kClipboardEnd; ++id) { for (ClipboardID id = 0; id < kClipboardEnd; ++id) {