--Boundary-00=_TghmGegkxLnHCgx Content-Type: text/plain; charset="ansi_x3.4-1968" Content-Transfer-Encoding: 7bit Content-Disposition: inline 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 --Boundary-00=_TghmGegkxLnHCgx Content-Type: text/x-diff; charset="ansi_x3.4-1968"; name="dcop-connections.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="dcop-connections.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 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() { }; + MetaData() : QMap() { } /** * Copy constructor. */ MetaData(const QMap&metaData) : - QMap(metaData) { }; + QMap(metaData) { } /** * Adds the given meta data map to this map. --- kio/kssl/ksslcertificatecache.cc +++ kio/kssl/ksslcertificatecache.cc @@ -29,23 +29,19 @@ #include -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 -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 #include #include +#include +#include #include #include @@ -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); --Boundary-00=_TghmGegkxLnHCgx--