Branch: master

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) **