Blob Blame History Raw
Index: kinit/klauncher.cpp
===================================================================
--- kinit/klauncher.cpp	(revision 918402)
+++ kinit/klauncher.cpp	(revision 918403)
@@ -167,7 +167,7 @@
 
 KLauncher::KLauncher(int _kdeinitSocket)
   : QObject(0),
-    kdeinitSocket(_kdeinitSocket), dontBlockReading(false)
+    kdeinitSocket(_kdeinitSocket)
 {
 #ifdef Q_WS_X11
    mCached_dpy = NULL;
@@ -276,8 +276,24 @@
 {
   ssize_t result;
   int bytes_left = len;
-  while ( bytes_left > 0)
-  {
+    while (bytes_left > 0) {
+        // in case we get a request to start an application and data arrive
+        // to kdeinitSocket at the same time, requestStart() will already
+        // call slotKDEInitData(), so we must check there's still something
+        // to read, otherwise this would block
+
+        // Same thing if kdeinit dies without warning.
+
+        fd_set in;
+        timeval tm = { 30, 0 }; // 30 seconds timeout, so we're not stuck in case kdeinit dies on us
+        FD_ZERO ( &in );
+        FD_SET( sock, &in );
+        select( sock + 1, &in, 0, 0, &tm );
+        if( !FD_ISSET( sock, &in )) {
+            kDebug(7016) << "read_socket" << sock << "nothing to read, kdeinit4 must be dead";
+            return -1;
+        }
+
      result = read(sock, buffer, bytes_left);
      if (result > 0)
      {
@@ -298,21 +314,7 @@
 {
    klauncher_header request_header;
    QByteArray requestData;
-   if( dontBlockReading )
-   {
-   // in case we get a request to start an application and data arrive
-   // to kdeinitSocket at the same time, requestStart() will already
-   // call slotKDEInitData(), so we must check there's still something
-   // to read, otherwise this would block
-      fd_set in;
-      timeval tm = { 0, 0 };
-      FD_ZERO ( &in );
-      FD_SET( kdeinitSocket, &in );
-      select( kdeinitSocket + 1, &in, 0, 0, &tm );
-      if( !FD_ISSET( kdeinitSocket, &in ))
-         return;
-   }
-   dontBlockReading = false;
+
    int result = read_socket(kdeinitSocket, (char *) &request_header,
                             sizeof( request_header));
    if (result == -1)
@@ -647,17 +649,21 @@
    request_header.cmd = LAUNCHER_EXEC_NEW;
 #endif
    request_header.arg_length = requestData.length();
+
+#ifdef KLAUNCHER_VERBOSE_OUTPUT
+   kDebug(7016) << "Asking kdeinit to start" << request->name << request->arg_list
+                << "cmd=" << commandToString(request_header.cmd);
+#endif
+
    write(kdeinitSocket, &request_header, sizeof(request_header));
    write(kdeinitSocket, requestData.data(), requestData.length());
 
    // Wait for pid to return.
    lastRequest = request;
-   dontBlockReading = false;
    do {
       slotKDEInitData( kdeinitSocket );
    }
    while (lastRequest != 0);
-   dontBlockReading = true;
 #endif
 }