libksane seems to break QProcess::start calls
Tobias Leupold
tl at l3u.de
Fri Mar 4 21:47:07 GMT 2022
> It's a side-effect. The problem is the QProcess::setupChildProcess virtual
> in Qt 5, that had been there since QProcess was introduced the the
> Paleolithic Era. When we use CLONE_PIDFD, we have to call clone() directly,
> which means the hooks installed by pthread_atfork() do not get run. In
> particular, this may mean the mutexes locked by other threads are all still
> locked, including one inside malloc(). That would mean the user's code in
> setupChildProcess() could deadlock depending on the kernel version.
Thanks again for clarifying this!
> ... So it was simplified to "if you derive, assume setupChildProcess
> was overridden."
I don't know if this would be still possible for the Qt 5 docs, but a small
hint like "If you subclass this, be aware that ..." woudn't hurt ... As said,
I would never have thought that this would have such side-effects!
Sure, Qt 6 has been out for some months now, but I think Qt 5 may be still
used for quite some time. Here at Gentoo, we e.g. don't even have Qt 6 in the
main package repository yet, and normally, Gentoo is not much hesitant to add
new versions ... but that's another issue.
> Anyway, please note that simply your problem still exists even without
> subclassing on kernels older than 5.4. For those, we have to use the SIGCHLD
> handler anyway. This must be fixed in the SANE backend.
If you're really bored some time, maybe you want to file an issue for the SANE
Pixma backend and tell the devs what exactly is wrong there and/or how to fix
this?
> Or you can work around it by doing what it is doing: fork().
Well, I think, if I'm safe with Qt >=5.15 and Kernel >=5.4, for now, I'd stick
with the simple implementation that works now. Forking some part of a Qt
program is something I even know less about than what can happen if I call
external programs via QProcess ... I'm quite happy to have it in a working
state now!
Surely, the fact that some SANE backends may cause issues with process calls
with older kernels should be mentioned in the still-to-write docs. But at the
moment, I think I should first see if anybody besides me ever considers the
project to be meaningful and if it would be worth it to make it safe for older
environments. Although it may be worth it to mess with this stuff to learn
more about process handling, threads and forks and so on.
I think, first, I'll get the whole thing in shape with a program icon,
installation target, message extraction script and so on. So that it _could_
be used. And then, I'll see if anybody actually wants to use it ;-)
More information about the kde-devel
mailing list