
stas at stason
Oct 4, 2005, 9:25 AM
Post #11 of 20
(3268 views)
Permalink
|
|
Re: $|, flushing, etc... [was Next Release]
[In reply to]
|
|
Tom Schindl wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Stas Bekman wrote: > >>Stas Bekman wrote: >> >> >>>Philip M. Gollucci wrote: >>>[...] >>> >>> >>>>6. Okay so from the 4 above attached files in #5 it looks like >>>>PerlIOApache_flush() is being called, but not working. >>>> [I'll list this function at the end of the e-mail.] >>>> Basically, I think there is a SNAFU here >>>> >>>>MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, FALSE), ":Apache2 >>>>IO flush"); >>>> >>>>That FALSE ends up being add_flush_bucket so even though we call >>>>flush we never get a flush bucket!!!!!! >>> >>> >>> >>>I think your observation and the fix are correct Philip. But before we >>>commit any fix we need to have a test that breaks and the fix fixes it. >> >> >>As I think more about it, there was a reason for this FALSE setting. As >>you know Apache will send headers as soon as it gets some data out and a >>flush bucket is by Apache-talk is data. So what was happening is that >>when users were doing something in their code that was causing perl to >>flush STDOUT behind the scenes (like a filehandle dup), Apache will go >>and generate the headers even if the user haven't had a chance to set >>those. That's why it was written in such a way: i.e. add a flush bucket >>only if there is some data to flush, otherwise you need to call >>$r->flush if you want the flush to be sent anyway. >> > > Stas if I get you right you say that the actual behaviour of "undef $|" > is desired and not a failure (I can somehow remember now the discussion) Thinking more about it we need a better fix. Currently modperl_wbucket_flush is not flexible enough. What PerlIOApache_flush needs is: - if there is data to flush, flush it and *unconditionaly* append the flush bucket - if there is no data to flush do nothing. modperl_wbucket_flush itself needs to have the other two cases that it supports now. a quick temp fix would be: Index: src/modules/perl/modperl_io_apache.c =================================================================== --- src/modules/perl/modperl_io_apache.c (revision 293536) +++ src/modules/perl/modperl_io_apache.c (working copy) @@ -170,9 +170,11 @@ rcfg->wbucket->outbuf, rcfg->wbucket->outcnt)); - MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, FALSE), - ":Apache2 IO flush"); - + if (rcfg->wbucket->outcnt) { + MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, TRUE), + ":Apache2 IO flush"); + } + return 0; } I think this is the desired behavior. We need a test for this case. Does it do the trick? If so, then modperl_wbucket_flush needs more work (that if() doesn't belong here, but to modperl_wbucket_flush. > I didn't get an answer when I asked if $r->flush does what the user > wanted too. Maybe I should ask again I've been only guessing. Sorry Tom, I have not read that question, I still have tons of emails to catch up with. Ideally, send here a new test that fails and we will be much quicker to look at it/fix it. > We should at least document the behaviour? I'd generate a fix for the > docs if my assumption is correct. -- _______________________________________________________________ Stas Bekman mailto:stas[at]stason.org | http://stason.org/ MailChannels: Assured Messaging (TM) | http://mailchannels.com/ The "Practical mod_perl" book | http://modperlbook.org/ --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe[at]perl.apache.org For additional commands, e-mail: dev-help[at]perl.apache.org
|