Last KProcess commit broke things (namely K3B)
Oswald Buddenhagen
ossi at kde.org
Fri Jan 16 23:06:27 GMT 2004
On Fri, Jan 16, 2004 at 09:20:57PM +0200, Andras Mantia wrote:
> I think this is really a showstopper after a fix for a showstopper... Without
> the attached patch (which is a revert of Ossi's fix) you cannot write data
> CD's anymore with K3B, as mkisofs will complain:
> Resource temporarily unavailable. cannot fwrite 32768*1
>
ok, problem identified. the attached patch should fix it - untested.
the situation:
- k3b spawns cdrecord with full io redirection. consequently (with my
kdecore patch), the parent process' end of the stdin socketpair is set
to non-blocking operation.
- after that, k3b spawns mkisofs. the culprit is, that it duplicates the
parent's stdin end of the other process directly to this process'
stdout. in itself this is no problem. however, the file descriptor
which is duped here was set up by kprocess for its own purposes; no
specific properties of it are documented. in fact, this already
changed once in the other direction in kde 3.1 (the commented out code
in k3bprocess documents this).
essentially the problem is kprocess' poor encapsulation, which seduces to
making assumptions ...
i plan to rewrite the kprocess api for kde 4, but for now we are stuck
with two suboptimal solutions:
- keep kprocess, declare k3b buggy and patch it
- keep k3b, revert kprocess, document that writeStdin supports at most
4K big blocks (at least on linux that's the pipe buffer's size) and
patch konsole accordingly. however, this is still not warranteed to
work always - if the other end does not read the entire buffer at
once, we still may end up with a blocking write and a deadlock.
ergo, i vote for the first solution ...
greetings
--
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!
--
Chaos, panic, and disorder - my work here is done.
-------------- next part --------------
Index: k3bprocess.cpp
===================================================================
RCS file: /home/kde/kdeextragear-1/k3b/src/core/k3bprocess.cpp,v
retrieving revision 1.12
diff -U2 -r1.12 k3bprocess.cpp
--- k3bprocess.cpp 14 Jan 2004 21:35:07 -0000 1.12
+++ k3bprocess.cpp 16 Jan 2004 23:05:36 -0000
@@ -318,4 +318,5 @@
if( ::dup2( d->dupStdoutFd, STDOUT_FILENO ) != -1 ) {
kdDebug() << "(K3bProcess) Successfully duplicated " << d->dupStdoutFd << " to " << STDOUT_FILENO << endl;
+ ::fcntl( STDOUT_FILENO, F_SETFL, ~O_NONBLOCK & fcntl( STDOUT_FILENO, F_GETFL ) ); // assume that this cannot fail
}
else {
More information about the kde-core-devel
mailing list