Do not unblock signals in main thread when waiting for kdesktop_lock response

This prevents incorrect cancellation of internal xcb poll() methods and subsequent deadlock
pull/2/head
Timothy Pearson 9 years ago
parent c1b62c1c4c
commit ab8dfbaaa4

@ -2092,7 +2092,6 @@ void LockProcess::slotPaintBackground(const TQPixmap &rpm)
setGeometry(0, 0, mRootWidth, mRootHeight);
erase();
}
// saverReadyIfNeeded();
}
void LockProcess::preparePopup()

@ -837,15 +837,13 @@ bool SaverEngine::waitForLockProcessStart() {
sigset_t empty_mask;
sigemptyset(&empty_mask);
// wait for SIGUSR1, SIGUSR2, SIGTTIN, SIGCHLD
// ensure that SIGCHLD is not subjec to a race condition
sigemptyset(&new_mask);
sigaddset(&new_mask, SIGUSR1);
sigaddset(&new_mask, SIGUSR2);
sigaddset(&new_mask, SIGTTIN);
sigaddset(&new_mask, SIGCHLD);
pthread_sigmask(SIG_BLOCK, &new_mask, NULL);
while ((mLockProcess.isRunning()) && (!mSaverProcessReady)) {
// wait for any signal to arrive
sigsuspend(&empty_mask);
}
pthread_sigmask(SIG_UNBLOCK, &new_mask, NULL);
@ -858,11 +856,10 @@ bool SaverEngine::waitForLockEngage() {
sigemptyset(&empty_mask);
// wait for SIGUSR1, SIGUSR2, SIGTTIN
pthread_sigmask(SIG_BLOCK, &mThreadBlockSet, NULL);
while ((mLockProcess.isRunning()) && (mState != Waiting) && (mState != Saving)) {
// wait for any signal to arrive
sigsuspend(&empty_mask);
}
pthread_sigmask(SIG_UNBLOCK, &mThreadBlockSet, NULL);
return mLockProcess.isRunning();
}
@ -882,4 +879,4 @@ void SaverEngineThreadHelperObject::terminateThread() {
if (eventLoop) {
eventLoop->exit(0);
}
}
}

Loading…
Cancel
Save