Author: torsten Date: Sun Apr 11 13:52:10 2010 New Revision: 932903 URL: http://svn.apache.org/viewvc?rev=932903&view=rev Log: Merged revisions 907778,930669,931194,931503,931506,932875,932879 via svnmerge from https://svn.eu.apache.org/repos/asf/perl/modperl/trunk
........ r907778 | phred | 2010-02-08 21:22:52 +0100 (Mon, 08 Feb 2010) | 2 lines Mark off one item from the todo list (Apache::Bootstrap) ........ r930669 | torsten | 2010-04-04 14:27:07 +0200 (Sun, 04 Apr 2010) | 1 line see http://www.gossamer-threads.com/lists/modperl/dev/101334 ........ r931194 | torsten | 2010-04-06 17:52:21 +0200 (Tue, 06 Apr 2010) | 1 line remove a superfluous apr_strdup call ........ r931503 | torsten | 2010-04-07 13:20:01 +0200 (Wed, 07 Apr 2010) | 1 line Make sure buffer is a valid SV in modperl_filter_read() ........ r931506 | torsten | 2010-04-07 13:39:02 +0200 (Wed, 07 Apr 2010) | 1 line Fix the check for the FilterInitHandler attribute in modperl_filter_resolve_init_handler() ........ r932875 | torsten | 2010-04-11 14:16:14 +0200 (Sun, 11 Apr 2010) | 22 lines Change the file handle preservation method for the perl-script handler from open SAVEIN, '<&STDIN'; open SAVEOUT, '>&STDOUT'; run_response_handler; open STDIN, '<&SAVEIN'; open STDOUT, '>&SAVEOUT'; to { local *STDIN; local *STDOUT; run_response_handler; } This way the file descriptor are preserved and issues like http://www.gossamer-threads.com/lists/modperl/modperl/94921 are fixed. ........ r932879 | torsten | 2010-04-11 14:20:06 +0200 (Sun, 11 Apr 2010) | 1 line Fix a typo in modperl_svptr_table.c ........ Added: perl/modperl/branches/threading/t/response/TestModperl/stdfd.pm - copied unchanged from r932879, perl/modperl/trunk/t/response/TestModperl/stdfd.pm perl/modperl/branches/threading/t/response/TestModperl/stdfd2.pm - copied unchanged from r932879, perl/modperl/trunk/t/response/TestModperl/stdfd2.pm Modified: perl/modperl/branches/threading/ (props changed) perl/modperl/branches/threading/Changes perl/modperl/branches/threading/src/modules/perl/mod_perl.c perl/modperl/branches/threading/src/modules/perl/modperl_filter.c perl/modperl/branches/threading/src/modules/perl/modperl_handler.c perl/modperl/branches/threading/src/modules/perl/modperl_io.c perl/modperl/branches/threading/src/modules/perl/modperl_svptr_table.c perl/modperl/branches/threading/todo/2.0.5 Propchange: perl/modperl/branches/threading/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Sun Apr 11 13:52:10 2010 @@ -1 +1 @@ -/perl/modperl/trunk:594682-672484,672819-681118,693357,700369,732889-736218,751909-752425,757553-774171,807116,807332-807649 +/perl/modperl/trunk:594682-672484,672819-681118,693357,700369,732889-736218,751909-752425,757553-774171,807116,807332-807649,907778-932879 Propchange: perl/modperl/branches/threading/ ------------------------------------------------------------------------------ --- svnmerge-integrated (original) +++ svnmerge-integrated Sun Apr 11 13:52:10 2010 @@ -1 +1 @@ -/perl/modperl/trunk:1-712967,712969-883859 +/perl/modperl/trunk:1-712967,712969-932896 Modified: perl/modperl/branches/threading/Changes URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/Changes?rev=932903&r1=932902&r2=932903&view=diff ============================================================================== --- perl/modperl/branches/threading/Changes (original) +++ perl/modperl/branches/threading/Changes Sun Apr 11 13:52:10 2010 @@ -31,6 +31,17 @@ Expose modperl_interp_t via ModPerl::Int =item 2.0.5-dev +Make sure standard file descriptors are preserved by the perl-script +handler [Torsten Foertsch] + +Fix the filter init handler attribute check in +modperl_filter_resolve_init_handler() [Torsten Foertsch] + +Make sure buffer is a valid SV in modperl_filter_read() [Torsten Foertsch] + +Move modperl_response_finish() out of modperl_response_handler_run in +mod_perl.c [Torsten Foertsch] + "MODPERL_INC= now correctly supported as an argument to Makefile.PL" [Torsten Foertsch] Modified: perl/modperl/branches/threading/src/modules/perl/mod_perl.c URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/mod_perl.c?rev=932903&r1=932902&r2=932903&view=diff ============================================================================== --- perl/modperl/branches/threading/src/modules/perl/mod_perl.c (original) +++ perl/modperl/branches/threading/src/modules/perl/mod_perl.c Sun Apr 11 13:52:10 2010 @@ -1008,7 +1008,7 @@ apr_status_t modperl_response_finish(req return modperl_wbucket_flush(rcfg->wbucket, FALSE); } -static int modperl_response_handler_run(request_rec *r, int finish) +static int modperl_response_handler_run(request_rec *r) { int retval; @@ -1020,20 +1020,13 @@ static int modperl_response_handler_run( r->handler = r->content_type; /* let http_core or whatever try */ } - if (finish) { - apr_status_t rc = modperl_response_finish(r); - if (rc != APR_SUCCESS) { - retval = rc; - } - } - return retval; } int modperl_response_handler(request_rec *r) { MP_dDCFG; - apr_status_t retval; + apr_status_t retval, rc; #ifdef USE_ITHREADS pTHX; @@ -1056,7 +1049,11 @@ int modperl_response_handler(request_rec modperl_env_request_populate(aTHX_ r); } - retval = modperl_response_handler_run(r, TRUE); + retval = modperl_response_handler_run(r); + rc = modperl_response_finish(r); + if (rc != APR_SUCCESS) { + retval = rc; + } #ifdef USE_ITHREADS MP_TRACE_i(MP_FUNC, "unselecting: (0x%lx)->refcnt=%ld", @@ -1109,7 +1106,7 @@ int modperl_response_handler_cgi(request modperl_env_request_tie(aTHX_ r); - retval = modperl_response_handler_run(r, FALSE); + retval = modperl_response_handler_run(r); modperl_env_request_untie(aTHX_ r); Modified: perl/modperl/branches/threading/src/modules/perl/modperl_filter.c URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_filter.c?rev=932903&r1=932902&r2=932903&view=diff ============================================================================== --- perl/modperl/branches/threading/src/modules/perl/modperl_filter.c (original) +++ perl/modperl/branches/threading/src/modules/perl/modperl_filter.c Sun Apr 11 13:52:10 2010 @@ -404,10 +404,12 @@ int modperl_filter_resolve_init_handler( FREETMPS;LEAVE; if (init_handler) { + modperl_mgv_resolve(aTHX_ init_handler, p, init_handler->name, 1); + MP_TRACE_h(MP_FUNC, "found init handler %s", modperl_handler_name(init_handler)); - if (!init_handler->attrs & MP_FILTER_INIT_HANDLER) { + if (!(init_handler->attrs & MP_FILTER_INIT_HANDLER)) { Perl_croak(aTHX_ "handler %s doesn't have " "the FilterInitHandler attribute set", modperl_handler_name(init_handler)); @@ -654,9 +656,14 @@ MP_INLINE static apr_size_t modperl_filt apr_size_t len = 0; (void)SvUPGRADE(buffer, SVt_PV); - SvPOK_only(buffer); SvCUR(buffer) = 0; + /* calling SvPOK_only here may leave buffer an invalid state since + * SvPVX may be NULL. But it's very likely that something is copied. + * So, we turn the POK flag on here. Later we check if SvPVX is NULL + * and turn the flag off again if so. */ + SvPOK_only(buffer); + /* sometimes the EOS bucket arrives in the same brigade with other * buckets, so that particular read() will not return 0 and will * be called again if called in the while ($filter->read(...)) @@ -682,6 +689,7 @@ MP_INLINE static apr_size_t modperl_filt wanted, MP_TRACE_STR_TRUNC(filter->pool, filter->leftover, wanted), filter->remaining); + SvGROW(buffer, wanted+1); sv_catpvn(buffer, filter->leftover, wanted); filter->leftover += wanted; filter->remaining -= wanted; @@ -692,6 +700,7 @@ MP_INLINE static apr_size_t modperl_filt "eating remaining %db", MP_FILTER_NAME(filter->f), filter->remaining); + SvGROW(buffer, filter->remaining+1); sv_catpvn(buffer, filter->leftover, filter->remaining); len = filter->remaining; filter->remaining = 0; @@ -728,6 +737,7 @@ MP_INLINE static apr_size_t modperl_filt if (buf_len) { if ((SvCUR(buffer) + buf_len) >= wanted) { int nibble = wanted - SvCUR(buffer); + SvGROW(buffer, SvCUR(buffer)+nibble+1); sv_catpvn(buffer, buf, nibble); filter->leftover = (char *)buf+nibble; filter->remaining = buf_len - nibble; @@ -736,11 +746,16 @@ MP_INLINE static apr_size_t modperl_filt } else { len += buf_len; + SvGROW(buffer, SvCUR(buffer)+buf_len+1); sv_catpvn(buffer, buf, buf_len); } } } + if (!SvPVX(buffer)) { + SvPOK_off(buffer); + } + MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "return: %db from %d bucket%s [%s]\n\t(%db leftover)", Modified: perl/modperl/branches/threading/src/modules/perl/modperl_handler.c URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_handler.c?rev=932903&r1=932902&r2=932903&view=diff ============================================================================== --- perl/modperl/branches/threading/src/modules/perl/modperl_handler.c (original) +++ perl/modperl/branches/threading/src/modules/perl/modperl_handler.c Sun Apr 11 13:52:10 2010 @@ -36,7 +36,8 @@ modperl_handler_t *modperl_handler_new(a break; } - handler->cv = NULL; + /* not necessary due to apr_pcalloc */ + /* handler->cv = NULL; */ handler->name = name; MP_TRACE_h(MP_FUNC, "new handler %s", handler->name); @@ -511,7 +512,7 @@ modperl_handler_t *modperl_handler_new_f Perl_croak(aTHX_ "can't resolve the code reference"); } name = apr_pstrcat(p, HvNAME(GvSTASH(gv)), "::", GvNAME(gv), NULL); - return modperl_handler_new(p, apr_pstrdup(p, name)); + return modperl_handler_new(p, name); default: break; }; Modified: perl/modperl/branches/threading/src/modules/perl/modperl_io.c URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_io.c?rev=932903&r1=932902&r2=932903&view=diff ============================================================================== --- perl/modperl/branches/threading/src/modules/perl/modperl_io.c (original) +++ perl/modperl/branches/threading/src/modules/perl/modperl_io.c Sun Apr 11 13:52:10 2010 @@ -104,136 +104,35 @@ MP_INLINE void modperl_io_handle_untie(p sv_unmagic(TIEHANDLE_SV(handle), PERL_MAGIC_tiedscalar); } -MP_INLINE GV *modperl_io_perlio_override_stdin(pTHX_ request_rec *r) +MP_INLINE static void +modperl_io_perlio_override_stdhandle(pTHX_ request_rec *r, int mode) { - dHANDLE("STDIN"); + dHANDLE(mode == O_RDONLY ? "STDIN" : "STDOUT"); int status; - GV *handle_save = (GV*)Nullsv; SV *sv = sv_newmortal(); - MP_TRACE_o(MP_FUNC, "start"); + MP_TRACE_o(MP_FUNC, "start STD%s", mode == O_RDONLY ? "IN" : "OUT"); - /* if STDIN is open, dup it, to be restored at the end of response */ - if (handle && SvTYPE(handle) == SVt_PVGV && - IoTYPE(GvIO(handle)) != IoTYPE_CLOSED) { - handle_save = gv_fetchpv(Perl_form(aTHX_ - "Apache2::RequestIO::_GEN_%ld", - (long)PL_gensym++), - TRUE, SVt_PVIO); - - /* open my $oldout, "<&STDIN" or die "Can't dup STDIN: $!"; */ - status = do_open(handle_save, "<&STDIN", 7, FALSE, - O_RDONLY, 0, Nullfp); - if (status == 0) { - Perl_croak(aTHX_ "Failed to dup STDIN: %" SVf, get_sv("!", TRUE)); - } - - /* similar to PerlIO::scalar, the PerlIO::Apache layer doesn't - * have file descriptors, so STDIN must be closed before it can - * be reopened */ - do_close(handle, TRUE); - } + save_gp(handle, 1); sv_setref_pv(sv, "Apache2::RequestRec", (void*)r); - status = do_open9(handle, "<:Apache2", 9, FALSE, O_RDONLY, - 0, Nullfp, sv, 1); + status = do_open9(handle, mode == O_RDONLY ? "<:Apache2" : ">:Apache2", + 9, FALSE, mode, 0, Nullfp, sv, 1); if (status == 0) { - Perl_croak(aTHX_ "Failed to open STDIN: %" SVf, get_sv("!", TRUE)); - } - - MP_TRACE_o(MP_FUNC, "end"); - - return handle_save; -} - -/* XXX: refactor to merge with the previous function */ -MP_INLINE GV *modperl_io_perlio_override_stdout(pTHX_ request_rec *r) -{ - dHANDLE("STDOUT"); - int status; - GV *handle_save = (GV*)Nullsv; - SV *sv = sv_newmortal(); - - MP_TRACE_o(MP_FUNC, "start"); - - /* if STDOUT is open, dup it, to be restored at the end of response */ - if (handle && SvTYPE(handle) == SVt_PVGV && - IoTYPE(GvIO(handle)) != IoTYPE_CLOSED) { - handle_save = gv_fetchpv(Perl_form(aTHX_ - "Apache2::RequestIO::_GEN_%ld", - (long)PL_gensym++), - TRUE, SVt_PVIO); - - /* open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!"; */ - status = do_open(handle_save, ">&STDOUT", 8, FALSE, - O_WRONLY, 0, Nullfp); - if (status == 0) { - Perl_croak(aTHX_ "Failed to dup STDOUT: %" SVf, get_sv("!", TRUE)); - } - - /* similar to PerlIO::scalar, the PerlIO::Apache layer doesn't - * have file descriptors, so STDOUT must be closed before it can - * be reopened */ - do_close(handle, TRUE); - } - - sv_setref_pv(sv, "Apache2::RequestRec", (void*)r); - status = do_open9(handle, ">:Apache2", 9, FALSE, O_WRONLY, - 0, Nullfp, sv, 1); - if (status == 0) { - Perl_croak(aTHX_ "Failed to open STDOUT: %" SVf, get_sv("!", TRUE)); - } - - MP_TRACE_o(MP_FUNC, "end"); - - /* XXX: shouldn't we preserve the value STDOUT had before it was - * overridden? */ - IoFLUSH_off(handle); /* STDOUT's $|=0 */ - - return handle_save; - -} - -MP_INLINE void modperl_io_perlio_restore_stdin(pTHX_ GV *handle) -{ - GV *handle_orig = gv_fetchpv("STDIN", FALSE, SVt_PVIO); - - MP_TRACE_o(MP_FUNC, "start"); - - /* close the overriding filehandle */ - do_close(handle_orig, FALSE); - - /* - * open STDIN, "<&STDIN_SAVED" or die "Can't dup STDIN_SAVED: $!"; - * close STDIN_SAVED; - */ - if (handle != (GV*)Nullsv) { - SV *err = Nullsv; - - MP_TRACE_o(MP_FUNC, "restoring STDIN"); - - if (do_open9(handle_orig, "<&", 2, FALSE, - O_RDONLY, 0, Nullfp, (SV*)handle, 1) == 0) { - err = get_sv("!", TRUE); - } - - do_close(handle, FALSE); - (void)hv_delete(gv_stashpv("Apache2::RequestIO", TRUE), - GvNAME(handle), GvNAMELEN(handle), G_DISCARD); - - if (err != Nullsv) { - Perl_croak(aTHX_ "Failed to restore STDIN: %" SVf, err); - } + Perl_croak(aTHX_ "Failed to open STD%s: %" SVf, + mode == O_RDONLY ? "IN" : "OUT", get_sv("!", TRUE)); } - MP_TRACE_o(MP_FUNC, "end"); + MP_TRACE_o(MP_FUNC, "end STD%s", mode==O_RDONLY ? "IN" : "OUT"); } -MP_INLINE void modperl_io_perlio_restore_stdout(pTHX_ GV *handle) +MP_INLINE static void +modperl_io_perlio_restore_stdhandle(pTHX_ int mode) { - GV *handle_orig = gv_fetchpv("STDOUT", FALSE, SVt_PVIO); + GV *handle_orig = gv_fetchpv(mode == O_RDONLY ? "STDIN" : "STDOUT", + FALSE, SVt_PVIO); - MP_TRACE_o(MP_FUNC, "start"); + MP_TRACE_o(MP_FUNC, "start STD%s", mode == O_RDONLY ? "IN" : "OUT"); /* since closing unflushed STDOUT may trigger a subrequest * (e.g. via mod_include), resulting in potential another response @@ -242,7 +141,8 @@ MP_INLINE void modperl_io_perlio_restore * level STDOUT is attempted to be closed. To prevent this * situation always explicitly flush STDOUT, before reopening it. */ - if (GvIOn(handle_orig) && IoOFP(GvIOn(handle_orig)) && + if (mode != O_RDONLY && + GvIOn(handle_orig) && IoOFP(GvIOn(handle_orig)) && (PerlIO_flush(IoOFP(GvIOn(handle_orig))) == -1)) { Perl_croak(aTHX_ "Failed to flush STDOUT: %" SVf, get_sv("!", TRUE)); } @@ -250,30 +150,29 @@ MP_INLINE void modperl_io_perlio_restore /* close the overriding filehandle */ do_close(handle_orig, FALSE); - /* - * open STDOUT, ">&STDOUT_SAVED" or die "Can't dup STDOUT_SAVED: $!"; - * close STDOUT_SAVED; - */ - if (handle != (GV*)Nullsv) { - SV *err = Nullsv; + MP_TRACE_o(MP_FUNC, "end STD%s", mode == O_RDONLY ? "IN" : "OUT"); +} - MP_TRACE_o(MP_FUNC, "restoring STDOUT"); +MP_INLINE GV *modperl_io_perlio_override_stdin(pTHX_ request_rec *r) +{ + modperl_io_perlio_override_stdhandle(aTHX_ r, O_RDONLY); + return NULL; +} - if (do_open9(handle_orig, ">&", 2, FALSE, - O_WRONLY, 0, Nullfp, (SV*)handle, 1) == 0) { - err = get_sv("!", TRUE); - } - - do_close(handle, FALSE); - (void)hv_delete(gv_stashpv("Apache2::RequestIO", TRUE), - GvNAME(handle), GvNAMELEN(handle), G_DISCARD); - - if (err != Nullsv) { - Perl_croak(aTHX_ "Failed to restore STDOUT: %" SVf, err); - } - } +MP_INLINE GV *modperl_io_perlio_override_stdout(pTHX_ request_rec *r) +{ + modperl_io_perlio_override_stdhandle(aTHX_ r, O_WRONLY); + return NULL; +} - MP_TRACE_o(MP_FUNC, "end"); +MP_INLINE void modperl_io_perlio_restore_stdin(pTHX_ GV *handle) +{ + modperl_io_perlio_restore_stdhandle(aTHX_ O_RDONLY); +} + +MP_INLINE void modperl_io_perlio_restore_stdout(pTHX_ GV *handle) +{ + modperl_io_perlio_restore_stdhandle(aTHX_ O_WRONLY); } /* Modified: perl/modperl/branches/threading/src/modules/perl/modperl_svptr_table.c URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_svptr_table.c?rev=932903&r1=932902&r2=932903&view=diff ============================================================================== --- perl/modperl/branches/threading/src/modules/perl/modperl_svptr_table.c (original) +++ perl/modperl/branches/threading/src/modules/perl/modperl_svptr_table.c Sun Apr 11 13:52:10 2010 @@ -62,7 +62,7 @@ PTR_TBL_t *modperl_svptr_table_clone(pTH dst_ary = tbl->tbl_ary; src_ary = source->tbl_ary; - Zero(&parms, 0, CLONE_PARAMS); + Zero(&parms, 1, CLONE_PARAMS); parms.flags = 0; parms.stashes = newAV(); Modified: perl/modperl/branches/threading/todo/2.0.5 URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/todo/2.0.5?rev=932903&r1=932902&r2=932903&view=diff ============================================================================== --- perl/modperl/branches/threading/todo/2.0.5 (original) +++ perl/modperl/branches/threading/todo/2.0.5 Sun Apr 11 13:52:10 2010 @@ -1,10 +1,9 @@ SHOW STOPPERS ==================== +- Ship Apache::Test 1.31 official [phred, ] - Windows Segfaults [needs windows developer owner, ] - MANIFEST verifications [needs detail, ] - rt.cpan.org PRs [pgollucci, phred, ] - - ModPerl::Bootstrap to handle the unknown mp generation PRS? -- Ship Apache::Test 1.31 official [phred, ] NICE TO HAVE =============