From 5d4afcb68fdff18aa9e44d1d111130cdb43e9ba4 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sun, 12 Apr 2015 22:29:58 -0500 Subject: [PATCH] Remove call to pthread_cancel() in kdesktop_lock This resolves a sporadic deadlock during kdesktop_lock termination (cherry picked from commit e569dd46ac06ef5a5f2ad03a311640e1834c749f) --- kdesktop/lock/CMakeLists.txt | 2 +- kdesktop/lock/lockprocess.cc | 21 +++++++++++++++++++-- kdesktop/lock/lockprocess.h | 9 +++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/kdesktop/lock/CMakeLists.txt b/kdesktop/lock/CMakeLists.txt index 256c6a498..2bbe4b289 100644 --- a/kdesktop/lock/CMakeLists.txt +++ b/kdesktop/lock/CMakeLists.txt @@ -38,6 +38,6 @@ set( ${target}_SRCS tde_add_executable( ${target} AUTOMOC SOURCES ${${target}_SRCS} LINK kdesktopsettings-static dmctl-static tdeio-shared Xext - ${GL_LIBRARIES} "${LINKER_IMMEDIATE_BINDING_FLAGS}" + pthread ${GL_LIBRARIES} "${LINKER_IMMEDIATE_BINDING_FLAGS}" DESTINATION ${BIN_INSTALL_DIR} ) diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index 4e3922a68..da12bd46c 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -81,6 +81,7 @@ #ifdef __linux__ #include +#include #endif #include @@ -304,7 +305,7 @@ LockProcess::LockProcess() // LockProcess::~LockProcess() { - mControlPipeHandlerThread->terminate(); + mControlPipeHandler->terminateThread(); mControlPipeHandlerThread->wait(); delete mControlPipeHandler; // delete mControlPipeHandlerThread; @@ -2828,6 +2829,9 @@ void LockProcess::saverReady() { // ControlPipeHandlerObject::ControlPipeHandlerObject() : TQObject() { mParent = NULL; + mRunning = false; + mTerminate = false; + mThreadID = 0L; } ControlPipeHandlerObject::~ControlPipeHandlerObject() { @@ -2835,10 +2839,14 @@ ControlPipeHandlerObject::~ControlPipeHandlerObject() { } void ControlPipeHandlerObject::run(void) { + mThreadID = pthread_self(); + mRunning = true; + int display_number = atoi(TQString(XDisplayString(tqt_xdisplay())).replace(":","").ascii()); if (display_number < 0) { printf("[kdesktop_lock] Warning: unable to create control socket. Interactive logon modules may not function properly.\n"); + mRunning = false; TQApplication::eventLoop()->exit(-1); return; } @@ -2869,6 +2877,7 @@ void ControlPipeHandlerObject::run(void) { if (!mParent->mPipeOpen) { printf("[kdesktop_lock] Warning: unable to create control socket '%s'. Interactive logon modules may not function properly.\n", fifo_file); + mRunning = false; TQApplication::eventLoop()->exit(-1); return; } @@ -2880,7 +2889,7 @@ void ControlPipeHandlerObject::run(void) { FD_SET(mParent->mPipe_fd, &rfds); TQByteArray readbuf(128); - while (mParent->mPipeOpen) { + while (mParent->mPipeOpen && !mTerminate) { TQString inputcommand = ""; // Wait for mParent->mPipe_fd to receive input @@ -2900,8 +2909,16 @@ void ControlPipeHandlerObject::run(void) { } } + mRunning = false; TQApplication::eventLoop()->exit(0); return; } +void ControlPipeHandlerObject::terminateThread() { + if (mRunning) { + mTerminate = true; + pthread_kill(mThreadID, SIGUSR1); + } +} + #include "lockprocess.moc" diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h index e063b9669..34e3da8e0 100644 --- a/kdesktop/lock/lockprocess.h +++ b/kdesktop/lock/lockprocess.h @@ -56,12 +56,18 @@ class ControlPipeHandlerObject : public TQObject public slots: void run(); + void terminateThread(); signals: void processCommand(TQString); public: LockProcess* mParent; + + private: + bool mRunning; + bool mTerminate; + pthread_t mThreadID; }; //=========================================================================== @@ -94,6 +100,9 @@ public: void msgBox( TQMessageBox::Icon type, const TQString &txt ); int execDialog( TQDialog* dlg ); +signals: + void terminateHelperThread(); + public slots: void quitSaver(); void preparePopup();