Avoid QDBusConnection Qt warning message for each KUniqueApplication

David Faure faure at kde.org
Mon Nov 19 11:33:43 GMT 2012


On Saturday 17 November 2012 10:05:46 Thiago Macieira wrote:
>  The private connection should be just placing calls, never receiving 
> them. So it does not need to register a service.
> 
> The parent process needs to wait for the child process to signal that it's 
> ready to receive the call. If I'm reading the code right, that's done by 
> writing a 32-bit zero to the pipe. Since that is there, I don't understand
> why  the call would fail.

There's a major contradiction between these two paragraphs.

Let me restate the issue. There are three events:

A - child registers service to DBus
B - parent makes newInstance() DBus call
C - child creates KApplication instance, which registers itself (as an object) 
to DBus

A must happen before B, otherwise the call errors with "no such service".
This is currently ensured by the parent-child pipe you mentionned.

But A and B happen before C by virtue of the API, because A and B are in 
KUniqueAplication::start(), while C is in "KUniqueApplication app;" which is 
typically further down in main(), see kuniqueapplication API docs.

However you say that A cannot happen before C because A should use 
QDBusConnection::sessionBus() for registering, and your warning in Qt says 
that sessionBus() cannot be used until a QCoreApplication instance exists, 
i.e. C.

Your idea seems to be, doing A as part of C (i.e. register service only after 
QApp exists), but the API doesn't allow that. B has to be inside 
KUniqueApplication::start(), the code that forks and synchronizes with a pipe.
Unblocking B only after C is done, would require writing to the pipe at the 
end of the KUniqueApplication constructor... Ugly. Well, OK, I gave it a try, 
see http://www.davidfaure.fr/2012/kuniqueapp_dbus.diff
Is this what you had in mind? It leaves one issue though: in the case where 
the app is already running, KApp calls ::_exit(0) but it should write to the 
pipe first, see TODO in the diff. Shall I really export the pipe in 
kuniqueapplication.cpp and write to it there in kapplication.cpp? It's getting
uglier and uglier...

-- 
David Faure, faure at kde.org, http://www.davidfaure.fr
Working on KDE, in particular KDE Frameworks 5
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20121119/46e54219/attachment.sig>


More information about the kde-core-devel mailing list