[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