perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stas Bekman <s...@stason.org>
Subject Re: [mp2] issues with certain serverrec setting methods
Date Sat, 26 Feb 2005 04:00:34 GMT
Stas Bekman wrote:
[...]
>   SV *server_admin = perl_get_sv("Apache::ServerRec::ServerAdmin", TRUE);
>   sv_setsv(server_admin, ST(1));
>   obj->server_admin = SvPVX(serever_admin);
> 
> i.e. we create a superficial perl variable to make sure that the value 
> will stick around if the original scalar is modified or destroyed.

So the fields that need a fixup are:

Apache::ServerRec: (all autogenerated)
  server_admin
  server_hostname
  error_fname
  path
  names
  wild_names

the following are non-pointer assignments (mostly int), so they need no
backup:

port
loglevel
timeout
keep_alive_timeout
keep_alive_max
keep_alive
limit_req_line
limit_req_fieldsize
limit_req_fields

And here is the patch:

Index: xs/maps/apache_structures.map
===================================================================
--- xs/maps/apache_structures.map	(revision 155373)
+++ xs/maps/apache_structures.map	(working copy)
@@ -76,10 +76,10 @@
  <  next
  -  defn_name
  -  defn_line_number
-$  server_admin
-$  server_hostname
+%  server_admin
+%  server_hostname
  $  port
-$  error_fname
+%  error_fname
  $  error_log
  $  loglevel
  <  is_virtual
@@ -90,10 +90,10 @@
  $  keep_alive_timeout
  $  keep_alive_max
  $  keep_alive
-$  path
+%  path
  -  pathlen
-$  names
-$  wild_names
+%  names
+%  wild_names
  $  limit_req_line
  $  limit_req_fieldsize
  $  limit_req_fields
Index: lib/ModPerl/MapUtil.pm
===================================================================
--- lib/ModPerl/MapUtil.pm	(revision 155373)
+++ lib/ModPerl/MapUtil.pm	(working copy)
@@ -25,10 +25,13 @@

  our @ISA = qw(Exporter);

-# the mapping happens in lib/ModPerl/StructureMap.pm
+# the mapping happens in lib/ModPerl/StructureMap.pm: sub parse
  #    '<' => 'auto-generated but gives only a read-only access'
  #    '&' => 'RDWR accessor to a char* field, supporting undef arg'
-#    '$'  => 'RONLY accessor, with WRITE accessor before child_init'
+#    '$' => 'RONLY accessor, with WRITE accessor before child_init'
+#    '%' => like $, but makes sure that for the write accessor the
+#           original perl scalar can change or go away w/o affecting
+#           the object
  my %disabled_map = (
      '!' => 'disabled or not yet implemented',
      '~' => 'implemented but not auto-generated',
Index: lib/ModPerl/WrapXS.pm
===================================================================
--- lib/ModPerl/WrapXS.pm	(revision 155376)
+++ lib/ModPerl/WrapXS.pm	(working copy)
@@ -256,6 +256,37 @@

  EOF
              }
+            elsif ($access_mode eq 'r+w_startup_dup') {
+
+                my $convert = $cast !~ /\bchar\b/
+                    ? "mp_xs_sv2_$cast"
+                    : "SvPV_nolen";
+
+                $code = <<EOF;
+$type
+$name(obj, val=Nullsv)
+    $class obj
+    SV *val
+
+    PREINIT:
+    $preinit
+$attrs
+
+    CODE:
+    RETVAL = ($cast) obj->$name;
+
+    if (items > 1) {
+         SV *dup = get_sv("_modperl_private::server_rec_$name", TRUE);
+         MP_CROAK_IF_THREADS_STARTED("setting $name");
+         sv_setsv(dup, val);
+         obj->$name = ($cast)$convert(dup);
+    }
+
+    OUTPUT:
+    RETVAL
+
+EOF
+            }
              elsif ($access_mode eq 'rw_char_undef') {
                  my $pool = $e->{pool}
                      or die "rw_char_undef accessors need pool";
Index: lib/ModPerl/StructureMap.pm
===================================================================
--- lib/ModPerl/StructureMap.pm	(revision 155373)
+++ lib/ModPerl/StructureMap.pm	(working copy)
@@ -128,6 +128,9 @@
                  elsif ($1 eq '$') {
                      $map->{$class}->{$_} = 'r+w_startup';
                  }
+                elsif ($1 eq '%') {
+                    $map->{$class}->{$_} = 'r+w_startup_dup';
+                }
              }
              else {
                  $map->{$class}->{$_} = undef;


-- 
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org


Mime
View raw message