[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    Re: Serious dcop deadlock, part 2
From:       Dirk Mueller <mueller () kde ! org>
Date:       2007-07-15 12:50:26
Message-ID: 200707151450.27269.mueller () kde ! org
[Download RAW message or body]

On Saturday, 14. July 2007, Charles Samuels wrote:

> dcop.log contains some extra stuff after the time of the crash. the last
> message it received was a registerAs and a isApplicationRegistered
>
> Good luck, but I bet this isn't enough information. :,(

Hmm, doesn't look like the log would be of any help. I'm afraid that there is 
a fundamental issue with more than one DCOPClient in the same process which 
we've been so far unable to find. At least I've spent my share of hours 
staring at the code and trying to figure it out. 

Unfortunately, those at SUSE that frequently hit this issue are not willing to 
install debugging versions of KDE to be able to track it down (even though 
they're ex-KDE-developers, bastards), so it remains a mystery to me. 

I'm however using myself the patch below and I haven't experienced any of 
those lockups anymore in many months. 


Dirk

["dcop-connections.diff" (text/x-diff)]

--- kio/kio/tcpslavebase.cpp
+++ kio/kio/tcpslavebase.cpp
@@ -75,7 +75,23 @@ public:
   QString host;
   QString realHost;
   QString ip;
-  DCOPClient *dcc;
+
+  DCOPClient* dcc() {
+      DCOPClient* client = DCOPClient::mainClient();
+      if ( !client ) {
+          DCOPClient::setMainClient( client = new DCOPClient );
+
+          if ( !client->isAttached() )
+              client->attach();
+      }
+
+      if (!client->isApplicationRegistered("kio_uiserver")) {
+          KApplication::startServiceByDesktopPath("kio_uiserver.desktop",
+                  QStringList() );
+      }
+      return client;
+  }
+
   KSSLPKCS12 *pkcs;
 
   int status;
@@ -132,7 +148,6 @@ void TCPSlaveBase::doConstructorStuff()
     d->ip = "";
     d->cc = 0L;
     d->usingTLS = false;
-    d->dcc = 0L;
     d->pkcs = 0L;
     d->status = -1;
     d->timeout = KProtocolManager::connectTimeout();
@@ -144,7 +159,6 @@ TCPSlaveBase::~TCPSlaveBase()
 {
     cleanSSL();
     if (d->usingTLS) delete d->kssl;
-    if (d->dcc) delete d->dcc;
     if (d->pkcs) delete d->pkcs;
     delete d;
 }
@@ -627,22 +641,13 @@ KSSLCertificateHome::KSSLAuthAction aa;
 
     if (certs.isEmpty()) return;  // we had nothing else, and prompt failed
 
-    if (!d->dcc) {
-        d->dcc = new DCOPClient;
-        d->dcc->attach();
-        if (!d->dcc->isApplicationRegistered("kio_uiserver")) {
-           KApplication::startServiceByDesktopPath("kio_uiserver.desktop",
-                                                   QStringList() );
-        }
-    }
-
      QByteArray data, retval;
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << ourHost;
      arg << certs;
      arg << metaData("window-id").toInt();
-     bool rc = d->dcc->call("kio_uiserver", "UIServer",
+     bool rc = d->dcc()->call("kio_uiserver", "UIServer",
                                "showSSLCertDialog(QString, QStringList,int)",
                                data, rettype, retval);
 
@@ -891,21 +896,12 @@ int TCPSlaveBase::verifyCertificate()
                 }
 
                 if (result == KMessageBox::Yes) {
-                   if (!d->dcc) {
-                      d->dcc = new DCOPClient;
-                      d->dcc->attach();
-                      if (!d->dcc->isApplicationRegistered("kio_uiserver")) {
-                         \
                KApplication::startServiceByDesktopPath("kio_uiserver.desktop",
-                         QStringList() );
-                      }
-
-                   }
                    QByteArray data, ignore;
                    QCString ignoretype;
                    QDataStream arg(data, IO_WriteOnly);
                    arg << theurl << mOutgoingMetaData;
                    arg << metaData("window-id").toInt();
-                        d->dcc->call("kio_uiserver", "UIServer",
+                        d->dcc()->call("kio_uiserver", "UIServer",
                                 "showSSLInfoDialog(QString,KIO::MetaData,int)",
                                 data, ignoretype, ignore);
                 }
@@ -1019,20 +1015,12 @@ int TCPSlaveBase::verifyCertificate()
                                  i18n("&Details"),
                                  i18n("Co&nnect"));
                 if (result == KMessageBox::Yes) {
-                   if (!d->dcc) {
-                      d->dcc = new DCOPClient;
-                      d->dcc->attach();
-                      if (!d->dcc->isApplicationRegistered("kio_uiserver")) {
-                         \
                KApplication::startServiceByDesktopPath("kio_uiserver.desktop",
-                         QStringList() );
-                      }
-                   }
                    QByteArray data, ignore;
                    QCString ignoretype;
                    QDataStream arg(data, IO_WriteOnly);
                    arg << theurl << mOutgoingMetaData;
                    arg << metaData("window-id").toInt();
-                        d->dcc->call("kio_uiserver", "UIServer",
+                        d->dcc()->call("kio_uiserver", "UIServer",
                                 "showSSLInfoDialog(QString,KIO::MetaData,int)",
                                 data, ignoretype, ignore);
                 }
@@ -1103,20 +1091,12 @@ int TCPSlaveBase::verifyCertificate()
 
       if ( result == KMessageBox::Yes )
       {
-          if (!d->dcc) {
-             d->dcc = new DCOPClient;
-             d->dcc->attach();
-             if (!d->dcc->isApplicationRegistered("kio_uiserver")) {
-                KApplication::startServiceByDesktopPath("kio_uiserver.desktop",
-                QStringList() );
-             }
-          }
           QByteArray data, ignore;
           QCString ignoretype;
           QDataStream arg(data, IO_WriteOnly);
           arg << theurl << mOutgoingMetaData;
           arg << metaData("window-id").toInt();
-          d->dcc->call("kio_uiserver", "UIServer",
+          d->dcc()->call("kio_uiserver", "UIServer",
                        "showSSLInfoDialog(QString,KIO::MetaData,int)",
                        data, ignoretype, ignore);
       }
--- kio/kio/kfilemetainfo.cpp
+++ kio/kio/kfilemetainfo.cpp
@@ -281,7 +281,7 @@ public:
     {}
 
     // wee use this one for the streaming operators
-    Data() {};
+    Data() {}
 
     KURL                              url;
     uint                              what;
@@ -1160,7 +1160,7 @@ public:
     ~Data() {
         if ( this == null )
             delete mimeTypeInfo;
-    };
+    }
 
     QString                             name;
     QMap<QString, KFileMetaInfoItem>    items;
--- kio/kio/kmimetyperesolver.h
+++ kio/kio/kmimetyperesolver.h
@@ -37,7 +37,7 @@ public:
     virtual void slotViewportAdjusted() = 0;
     virtual void slotProcessMimeIcons() = 0;
 protected:
-    virtual void virtual_hook( int, void* ) {};
+    virtual void virtual_hook( int, void* ) {}
 };
 
 /**
--- kio/kio/slavebase.h
+++ kio/kio/slavebase.h
@@ -737,7 +737,7 @@ public:
      * @obsolete as of 3.1. Use openPassDlg instead.
      * TODO: Remove before KDE 4.0
      */
-    void setMultipleAuthCaching( bool ) {};
+    void setMultipleAuthCaching( bool ) {}
 
     /**
      * @obsolete as of 3.1. Use openPassDlg instead.
--- kio/kio/kurifilter.cpp
+++ kio/kio/kurifilter.cpp
@@ -51,7 +51,7 @@ void KURIFilterPlugin::setFilteredURI( K
 class KURIFilterDataPrivate
 {
 public:
-    KURIFilterDataPrivate() {};
+    KURIFilterDataPrivate() {}
     QString abs_path;
     QString args;
     QString typedString;
--- kio/kio/renamedlgplugin.h
+++ kio/kio/renamedlgplugin.h
@@ -37,7 +37,7 @@ public:
   /**
    * This is the c'tor.
    */
-  RenameDlgPlugin(QDialog *dialog, const char *name, const QStringList &/*list*/ = \
QStringList() ): QWidget(dialog, name ) {}; +  RenameDlgPlugin(QDialog *dialog, const \
char *name, const QStringList &/*list*/ = QStringList() ): QWidget(dialog, name ) {}  \
  /** 
    * This function will be called by RenameDlg. The params are infos about the \
files. @@ -51,7 +51,7 @@ public:
 		  time_t /*ctimeSrc*/,
 		  time_t /*ctimeDest*/,
 		  time_t /*mtimeSrc*/,
-		  time_t /*mtimeDest*/ ) {return false;};
+		  time_t /*mtimeDest*/ ) {return false;}
 
 };
 
--- kio/kio/passdlg.h
+++ kio/kio/passdlg.h
@@ -115,7 +115,7 @@ public:
      */
     KDE_DEPRECATED void setEnableUserField( bool enable, bool=false ) {
 	setUserReadOnly( !enable );
-    };
+    }
 
     /**
      * Presets the password.
--- kio/kio/ksambashare.cpp
+++ kio/kio/ksambashare.cpp
@@ -203,7 +203,7 @@ bool KSambaShare::isDirectoryShared( con
   if ( path[path.length()-1] != '/' )
        fixedPath += '/';
   
-  return d->sharedPaths.find(fixedPath) > 0;
+  return d->sharedPaths.find(fixedPath) != 0;
 }
 
 QStringList KSambaShare::sharedDirectories() const {
--- kio/kio/ktrader.cpp
+++ kio/kio/ktrader.cpp
@@ -34,7 +34,7 @@ using namespace KIO;
 class KTraderSorter
 {
 public:
-  KTraderSorter() { m_pService = 0; };
+  KTraderSorter() { m_pService = 0; }
   KTraderSorter( const KTraderSorter& s ) : m_userPreference( s.m_userPreference ),
     m_bAllowAsDefault( s.m_bAllowAsDefault ),
     m_traderPreference( s.m_traderPreference ), m_pService( s.m_pService ) { }
--- kio/kio/global.h
+++ kio/kio/global.h
@@ -515,12 +515,12 @@ public:
   /**
    * Creates an empty meta data map.
    */
-   MetaData() : QMap<QString, QString>() { };
+   MetaData() : QMap<QString, QString>() { }
   /**
    * Copy constructor.
    */
    MetaData(const QMap<QString, QString>&metaData) :
-     QMap<QString, QString>(metaData) { };
+     QMap<QString, QString>(metaData) { }
 
    /**
     * Adds the given meta data map to this map.
--- kio/kssl/ksslcertificatecache.cc
+++ kio/kssl/ksslcertificatecache.cc
@@ -29,23 +29,19 @@
 #include <kdatastream.h>
 
 
-class KSSLCertificateCache::KSSLCertificateCachePrivate {
-  public:
-  DCOPClient *dcc;
-
-  KSSLCertificateCachePrivate()  { dcc = new DCOPClient; dcc->attach(); }
-  ~KSSLCertificateCachePrivate() { delete dcc;}
-
+struct KSSLCertificateCache::KSSLCertificateCachePrivate 
+{
 };
 
 
-
-KSSLCertificateCache::KSSLCertificateCache() {
-  d = new KSSLCertificateCachePrivate;
+KSSLCertificateCache::KSSLCertificateCache() 
+    : d(0)
+{
 }
 
 
-KSSLCertificateCache::~KSSLCertificateCache() {
+KSSLCertificateCache::~KSSLCertificateCache() 
+{
   delete d;
 }
 
@@ -69,7 +65,7 @@ void KSSLCertificateCache::reload() {
      QByteArray data, retval;
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
-     d->dcc->call("kded", "kssld",
+     DCOPClient::mainClient()->call("kded", "kssld",
                   "cacheReload()",
                   data, rettype, retval);
 }
@@ -83,7 +79,7 @@ void KSSLCertificateCache::addCertificat
      arg << cert;
      arg << policy;
      arg << permanent;
-     d->dcc->call("kded", "kssld",
+     DCOPClient::mainClient()->call("kded", "kssld",
                   "cacheAddCertificate(KSSLCertificate,KSSLCertificateCache::KSSLCertificatePolicy,bool)",
  data, rettype, retval);
 }
@@ -95,7 +91,7 @@ KSSLCertificateCache::KSSLCertificatePol
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cn;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheGetPolicyByCN(QString)",
                             data, rettype, retval);
 
@@ -114,7 +110,7 @@ KSSLCertificateCache::KSSLCertificatePol
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cert;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheGetPolicyByCertificate(KSSLCertificate)",
                             data, rettype, retval);
 
@@ -134,7 +130,7 @@ bool KSSLCertificateCache::seenCN(QStrin
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cn;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheSeenCN(QString)",
                             data, rettype, retval);
 
@@ -154,7 +150,7 @@ bool KSSLCertificateCache::seenCertifica
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cert;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheSeenCertificate(KSSLCertificate)",
                             data, rettype, retval);
 
@@ -174,7 +170,7 @@ bool KSSLCertificateCache::isPermanent(K
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cert;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheIsPermanent(KSSLCertificate)",
                             data, rettype, retval);
 
@@ -195,7 +191,7 @@ bool KSSLCertificateCache::removeByCN(QS
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cn;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheRemoveByCN(QString)",
                             data, rettype, retval);
 
@@ -215,7 +211,7 @@ bool KSSLCertificateCache::removeByCerti
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cert;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheRemoveByCertificate(KSSLCertificate)",
                             data, rettype, retval);
 
@@ -239,7 +235,7 @@ bool KSSLCertificateCache::modifyByCN(QS
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cn << policy << permanent << expires;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             \
"cacheModifyByCN(QString,KSSLCertificateCache::KSSLCertificatePolicy,bool,QDateTime)",
  data, rettype, retval);
 
@@ -262,7 +258,7 @@ bool KSSLCertificateCache::modifyByCerti
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cert << policy << permanent << expires;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             \
"cacheModifyByCertificate(KSSLCertificate,KSSLCertificateCache::KSSLCertificatePolicy,bool,QDateTime)",
  data, rettype, retval);
 
@@ -282,7 +278,7 @@ QStringList KSSLCertificateCache::getHos
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cert;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheGetHostList(KSSLCertificate)",
                             data, rettype, retval);
 
@@ -302,7 +298,7 @@ bool KSSLCertificateCache::addHost(KSSLC
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cert << host;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheAddHost(KSSLCertificate,QString)",
                             data, rettype, retval);
 
@@ -323,7 +319,7 @@ bool KSSLCertificateCache::removeHost(KS
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << cert << host;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "cacheRemoveHost(KSSLCertificate,QString)",
                             data, rettype, retval);
 
@@ -343,7 +339,7 @@ QStringList KSSLCertificateCache::getKDE
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << email;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "getKDEKeyByEmail(QString)",
                             data, rettype, retval);
 
@@ -363,7 +359,7 @@ KSSLCertificate *KSSLCertificateCache::g
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << key;
-     bool rc = d->dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                             "getCertByMD5Digest(QString)",
                             data, rettype, retval);
 
--- kio/kssl/ksslcertificatecache.h
+++ kio/kssl/ksslcertificatecache.h
@@ -93,7 +93,7 @@ enum KSSLCertificatePolicy { Unknown, Re
 
 private:
   class KSSLCertificateCachePrivate;
-  KSSLCertificateCachePrivate *d;
+  KSSLCertificateCachePrivate * const d;
 
   void loadDefaultPolicies();
   void clearList();
--- kio/kssl/ksslsigners.cc
+++ kio/kssl/ksslsigners.cc
@@ -29,14 +29,14 @@
 #include <kdatastream.h>
 
 
-KSSLSigners::KSSLSigners() {
-	dcc = new DCOPClient;
-	dcc->attach();
+KSSLSigners::KSSLSigners()
+    : d(0)
+{
 }
 
 
-KSSLSigners::~KSSLSigners() {
-	delete dcc;
+KSSLSigners::~KSSLSigners() 
+{
 }
 
 bool KSSLSigners::addCA(KSSLCertificate& cert,
@@ -56,7 +56,7 @@ bool KSSLSigners::addCA(QString cert,
      QDataStream arg(data, IO_WriteOnly);
      arg << cert;
      arg << ssl << email << code;
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caAdd(QString,bool,bool,bool)",
                          data, rettype, retval);
 
@@ -75,7 +75,7 @@ bool KSSLSigners::regenerate() {
      QByteArray data, retval;
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caRegenerate()",
                          data, rettype, retval);
 
@@ -100,7 +100,7 @@ bool KSSLSigners::useForSSL(QString subj
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << subject;
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caUseForSSL(QString)",
                          data, rettype, retval);
 
@@ -125,7 +125,7 @@ bool KSSLSigners::useForEmail(QString su
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << subject;
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caUseForEmail(QString)",
                          data, rettype, retval);
 
@@ -150,7 +150,7 @@ bool KSSLSigners::useForCode(QString sub
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << subject;
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caUseForCode(QString)",
                          data, rettype, retval);
 
@@ -175,7 +175,7 @@ bool KSSLSigners::remove(QString subject
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << subject;
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caRemove(QString)",
                          data, rettype, retval);
 
@@ -195,7 +195,7 @@ QStringList KSSLSigners::list() {
      QByteArray data, retval;
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caList()",
                          data, rettype, retval);
 
@@ -214,7 +214,7 @@ QString KSSLSigners::getCert(QString sub
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << subject;
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caGetCert(QString)",
                          data, rettype, retval);
 
@@ -232,7 +232,7 @@ bool KSSLSigners::setUse(QString subject
      QCString rettype;
      QDataStream arg(data, IO_WriteOnly);
      arg << subject << ssl << email << code;
-     bool rc = dcc->call("kded", "kssld",
+     bool rc = DCOPClient::mainClient()->call("kded", "kssld",
                          "caSetUse(QString,bool,bool,bool)",
                          data, rettype, retval);
 
--- kio/kssl/ksslsigners.h
+++ kio/kssl/ksslsigners.h
@@ -163,9 +163,9 @@ public:
 
 private:
 	class KSSLSignersPrivate;
-	KSSLSignersPrivate *d;
+	KSSLSignersPrivate * const d;
 
-	DCOPClient *dcc;
+	void *m_unused;
 };
--- dcop/dcopclient.cpp
+++ dcop/dcopclient.cpp
@@ -41,6 +41,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE 
 #include <sys/stat.h>
 #include <sys/file.h>
 #include <sys/socket.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 #include <ctype.h>
 #include <unistd.h>
@@ -818,6 +820,7 @@ bool DCOPClient::attachInternal( bool re
         emit attachFailed(QString::fromLatin1( errBuf ));
         return false;
     }
+    fcntl(socket(), F_SETFL, FD_CLOEXEC);
 
     IceSetShutdownNegotiation(d->iceConn, False);
 



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic