kjob::exec and autodeletion
adam at kde.org
Sat Apr 11 20:47:16 BST 2009
KJob::exec() uses a secondary event loop to implement synchronous execution of
a job. On OSX (at least), if the job is set to delete itself, that event loop
will get and process the deletion even posted by deleteLater(), just after
emitting result() (which leads to a quit() of the event loop), such that upon
return from exec() the job is already deleted and the subsequent access to the
private object crashes. This does not seem to happen on Linux, at least, but I
seem to remember seeing it happen on Windows as well, somewhere in Kleo, which
does something similar in its job class.
Attached patch works around this issue. I can't make up my mind whether this
is to be considered a bug in Qt, after all the chain of events _should_ be, at
least according to my expectations:
- job emits result
- slot connected to result() syncronously executes, in this case
QEventLooop::quit(), since we are single threaded here, presumably
- job calls deleteLater() on itself
- deletion event gets posted to the event queue
- secondary event loop does no further processing, since it's been quit
- QEventLoop::exec returns to the job's exec(), which started it
- job's exec() finishes processing
- primary event loop processes deletion event and actually deletes the job
Maybe the way that things are hooked into the platform eventing is different,
such that quitting a secondary event loop does not immediately stop all
processing it is doing. Does anyone know?
In any case, shall I commit the workaround, or does someone have a better one?
Till Adam <adam at kde.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 1076 bytes
Desc: not available
More information about the kde-core-devel