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
 =============


Reply via email to