92d1f764 | 2015-04-12 22:33:03 | Timothy Pearson |
Handle screen locking internally on user switch This removes an external dcop call |
||
M kdesktop/krootwm.cc |
||
diff --git a/kdesktop/krootwm.cc b/kdesktop/krootwm.cc index 72b9f0f..6ca1862 100644 --- a/kdesktop/krootwm.cc +++ b/kdesktop/krootwm.cc @@ -872,7 +872,11 @@ void KRootWm::slotSessionActivated( int ent ) { if (ent > 0 && !sessionsMenu->isItemChecked( ent )) { - DM().lockSwitchVT( ent ); + m_pSaver->lockScreen(); + if (!m_pSaver->waitForLockEngage()) { + return; + } + DM().switchVT( ent ); } } |
||
e569dd46 | 2015-04-12 22:33:04 | Timothy Pearson |
Remove call to pthread_cancel() in kdesktop_lock This resolves a sporadic deadlock during kdesktop_lock termination |
||
M kdesktop/lock/CMakeLists.txt M kdesktop/lock/lockprocess.cc M kdesktop/lock/lockprocess.h |
||
diff --git a/kdesktop/lock/CMakeLists.txt b/kdesktop/lock/CMakeLists.txt index 256c6a4..2bbe4b2 100644 --- a/kdesktop/lock/CMakeLists.txt +++ b/kdesktop/lock/CMakeLists.txt @@ -38,6 +38,6 @@ 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 4e3922a..da12bd4 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() { - mControlPipeHandlerThread->terminate(); + mControlPipeHandler->terminateThread(); mControlPipeHandlerThread->wait(); delete mControlPipeHandler; // delete mControlPipeHandlerThread; @@ -2828,6 +2829,9 @@ // ControlPipeHandlerObject::ControlPipeHandlerObject() : TQObject() { mParent = NULL; + mRunning = false; + mTerminate = false; + mThreadID = 0L; } ControlPipeHandlerObject::~ControlPipeHandlerObject() { @@ -2835,10 +2839,14 @@ } 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 @@ 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 @@ 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 @@ } } + 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 e063b96..34e3da8 100644 --- a/kdesktop/lock/lockprocess.h +++ b/kdesktop/lock/lockprocess.h @@ -56,12 +56,18 @@ 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 @@ void msgBox( TQMessageBox::Icon type, const TQString &txt ); int execDialog( TQDialog* dlg ); +signals: + void terminateHelperThread(); + public slots: void quitSaver(); void preparePopup(); |
||
37bc5cdd | 2015-04-12 23:05:48 | Timothy Pearson |
Fix long-standing inverted signal mask in kdesktop_lock initial sigsuspend Prevent helper thread termination signal from errantly being handled by main thread |
||
M kdesktop/lock/lockprocess.cc M kdesktop/lock/main.cc |
||
diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index da12bd4..a4a2bad 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -2842,6 +2842,13 @@ mThreadID = pthread_self(); mRunning = true; + sigset_t new_mask; + sigemptyset(&new_mask); + sigaddset(&new_mask, SIGUSR1); + + // Unblock SIGUSR1 + pthread_sigmask(SIG_UNBLOCK, &new_mask, NULL); + int display_number = atoi(TQString(XDisplayString(tqt_xdisplay())).replace(":","").ascii()); if (display_number < 0) { diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc index bafa025..c1b1da2 100644 --- a/kdesktop/lock/main.cc +++ b/kdesktop/lock/main.cc @@ -378,52 +378,52 @@ if (args->isSet( "internal" )) { kdesktop_pid = atoi(args->getOption( "internal" )); + sigset_t new_mask; + sigset_t orig_mask; + struct sigaction act; + + in_internal_mode = TRUE; + + // handle SIGUSR1 + act.sa_handler= sigusr1_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGUSR1); + act.sa_flags = 0; + sigaction(SIGUSR1, &act, 0L); + // handle SIGUSR2 + act.sa_handler= sigusr2_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGUSR2); + act.sa_flags = 0; + sigaction(SIGUSR2, &act, 0L); + // handle SIGWINCH (an ersatz SIGUSR3) + act.sa_handler= sigusr3_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGWINCH); + act.sa_flags = 0; + sigaction(SIGWINCH, &act, 0L); + // handle SIGTTIN (an ersatz SIGUSR4) + act.sa_handler= sigusr4_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGTTIN); + act.sa_flags = 0; + sigaction(SIGTTIN, &act, 0L); + // handle SIGTTOU (an ersatz SIGUSR5) + act.sa_handler= sigusr5_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGTTOU); + act.sa_flags = 0; + sigaction(SIGTTOU, &act, 0L); + + // initialize the signal masks + sigemptyset(&new_mask); + sigaddset(&new_mask,SIGUSR1); + sigaddset(&new_mask,SIGUSR2); + sigaddset(&new_mask,SIGWINCH); + sigaddset(&new_mask,SIGTTIN); + sigaddset(&new_mask,SIGTTOU); + while (signalled_run == FALSE) { - sigset_t new_mask; - sigset_t orig_mask; - struct sigaction act; - - in_internal_mode = TRUE; - - // handle SIGUSR1 - act.sa_handler= sigusr1_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGUSR1); - act.sa_flags = 0; - sigaction(SIGUSR1, &act, 0L); - // handle SIGUSR2 - act.sa_handler= sigusr2_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGUSR2); - act.sa_flags = 0; - sigaction(SIGUSR2, &act, 0L); - // handle SIGWINCH (an ersatz SIGUSR3) - act.sa_handler= sigusr3_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGWINCH); - act.sa_flags = 0; - sigaction(SIGWINCH, &act, 0L); - // handle SIGTTIN (an ersatz SIGUSR4) - act.sa_handler= sigusr4_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGTTIN); - act.sa_flags = 0; - sigaction(SIGTTIN, &act, 0L); - // handle SIGTTOU (an ersatz SIGUSR5) - act.sa_handler= sigusr5_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGTTOU); - act.sa_flags = 0; - sigaction(SIGTTOU, &act, 0L); ** Diff limit reached (max: 250 lines) ** |