diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2015-04-12 22:29:58 -0500 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2015-04-14 02:27:26 +0200 |
commit | 5d4afcb68fdff18aa9e44d1d111130cdb43e9ba4 (patch) | |
tree | b21fd08b95b326fd66cd59b28022c5a02fa221af | |
parent | 1f266258df399ea64c10001b161a2fb209140b62 (diff) | |
download | tdebase-5d4afcb68fdff18aa9e44d1d111130cdb43e9ba4.tar.gz tdebase-5d4afcb68fdff18aa9e44d1d111130cdb43e9ba4.zip |
Remove call to pthread_cancel() in kdesktop_lock
This resolves a sporadic deadlock during kdesktop_lock termination
(cherry picked from commit e569dd46ac06ef5a5f2ad03a311640e1834c749f)
-rw-r--r-- | kdesktop/lock/CMakeLists.txt | 2 | ||||
-rw-r--r-- | kdesktop/lock/lockprocess.cc | 21 | ||||
-rw-r--r-- | 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 <linux/stat.h> +#include <pthread.h> #endif #include <X11/Xlib.h> @@ -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(); |