You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by st...@apache.org on 2005/02/04 19:45:10 UTC

svn commit: r151387 - in perl/modperl/trunk/ModPerl-Registry/t: cgi-bin/ithreads_io_n_tie.pl ithreads.t

Author: stas
Date: Fri Feb  4 10:45:08 2005
New Revision: 151387

URL: http://svn.apache.org/viewcvs?view=rev&rev=151387
Log:
exercise the issues of STDOUT opened to :Apache perlio layer

Added:
    perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/ithreads_io_n_tie.pl   (with props)
    perl/modperl/trunk/ModPerl-Registry/t/ithreads.t   (with props)

Added: perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/ithreads_io_n_tie.pl
URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/ithreads_io_n_tie.pl?view=auto&rev=151387
==============================================================================
--- perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/ithreads_io_n_tie.pl (added)
+++ perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/ithreads_io_n_tie.pl Fri Feb  4 10:45:08 2005
@@ -0,0 +1,82 @@
+use strict;
+use warnings FATAL => 'all';
+
+#
+# there is a problem when STDOUT is internally opened to an
+# Apache::PerlIO layer is cloned on a new thread start. PerlIO_clone
+# in perl_clone() is called too early, before PL_defstash is
+# cloned. As PerlIO_clone calls PerlIOApache_getarg, which calls
+# gv_fetchpv via sv_setref_pv and boom the segfault happens.
+#
+# at the moment we should either not use an internally opened to
+# :Apache streams, so the config must be:
+#
+# SetHandler modperl
+#
+# and then either use $r->print("foo") or tie *STDOUT, $r + print "foo"
+#
+# or close and re-open STDOUT to :Apache *after* the thread was spawned
+#
+# the above discussion equally applies to STDIN
+#
+# XXX: ->join calls leak under registry, this doesn't happen in the
+# non-registry tests.
+
+use threads;
+
+my $r = shift;
+$r->print("Content-type: text/plain\n\n");
+
+{
+    # now we can use $r->print API:
+    my $thr = threads->new(
+        sub {
+            my $id = shift;
+            $r->print("thread $id\n");
+            return 1;
+        }, 1);
+    # $thr->join; # XXX: leaks scalar
+}
+
+{
+    # close and re-open STDOUT to :Apache *after* the thread was
+    # spawned
+    my $thr = threads->new(
+        sub {
+            my $id = shift;
+            close STDOUT;
+            open STDOUT, ">:Apache", $r
+                or die "can't open STDOUT via :Apache layer : $!";
+            print "thread $id\n";
+            return 1;
+        }, 2);
+    # $thr->join; # XXX: leaks scalar
+}
+
+{
+    # tie STDOUT to $r *after* the ithread was started has
+    # happened, in which case we can use print
+    my $thr = threads->new(
+        sub {
+            my $id = shift;
+            tie *STDOUT, $r;
+            print "thread $id\n";
+            return 1;
+        }, 3);
+    # $thr->join; # XXX: leaks scalar
+}
+
+{
+    # tie STDOUT to $r before the ithread was started has
+    # happened, in which case we can use print
+    tie *STDOUT, $r;
+    my $thr = threads->new(
+        sub {
+            my $id = shift;
+            print "thread $id\n";
+            return 1;
+        }, 4);
+    # $thr->join; # XXX: leaks scalar
+}
+
+print "parent";

Propchange: perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/ithreads_io_n_tie.pl
------------------------------------------------------------------------------
    svn:executable = *

Added: perl/modperl/trunk/ModPerl-Registry/t/ithreads.t
URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/ModPerl-Registry/t/ithreads.t?view=auto&rev=151387
==============================================================================
--- perl/modperl/trunk/ModPerl-Registry/t/ithreads.t (added)
+++ perl/modperl/trunk/ModPerl-Registry/t/ithreads.t Fri Feb  4 10:45:08 2005
@@ -0,0 +1,20 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestUtil;
+use Apache::TestRequest;
+
+use Config;
+
+use constant HAS_ITHREADS => ($] >= 5.008001 && $Config{useithreads});
+
+plan tests => 1, need
+    {"perl 5.8.1 or higher w/ithreads enabled is required" => HAS_ITHREADS};
+
+{
+    my $expected = join "\n", map("thread $_", 1..4), "parent";
+    my $url = "/registry_modperl_handler/ithreads_io_n_tie.pl";
+    my $received = GET_BODY_ASSERT($url);
+    ok t_cmp $received, $expected;
+}

Propchange: perl/modperl/trunk/ModPerl-Registry/t/ithreads.t
------------------------------------------------------------------------------
    svn:eol-style = native