Stas Bekman wrote:
I've rebuit with --enable-pool-debug CPPFLAGS="-DAPR_BUCKET_DEBUG", but also apr1/httpd2.1

% ~/perl/5.8.x/bin/perl -MApache2 -MAPR::Pool -MAPR::Table -wle '
$t= APR::Table::make(APR::Pool->new, 10); $t->set($_=>$_), print "Set $_" for 1..20'


Segmentation fault


Now I get the segfault

I get it also with apr-0.9/httpd-2.0.

I'm back to work on this temp pool object issue. I've found what I think is another problem.

APR::BucketAlloc
apr_bucket_alloc_create(p)
    APR::Pool p

So if we link pool to alloc, everything is cool, but when this alloc is used to create something and then goes out of scope as in:

  {
     my $ba = APR::Bucket::alloc_create(APR::Pool->new);
     $b = APR::Bucket::eos_create($ba);
  }

now $b guts are wiped, since $ba and the temp pool are gone. Am I right?

In which case it's not enough to make pool's destroy on the other objects that use it, but it goes further down the chain, in this example the bucket needs to link the allocator so that doesn't get nuked before the bucket is done with its scope?

There are probably other chain dependency issues.

I think there is one more problem with preventing from the temp object pools being destroyed this is related to the problem previously discovered with modperl_bucket.c:

    /* PADTMP SVs belong to perl and can't be stored away, since perl
     * is going to reuse them, so we have no choice but to copy the
     * data away, before storing sv */
    if (SvPADTMP(sv)) {
        STRLEN len;
        char *pv = SvPV(sv, len);
        svbucket->sv = newSVpvn(pv, len);
    }

so for example I think this code:

  sub make_table {
     return APR::Table::make(APR::Pool->new, 10);
  }
  push @tables, make_table() for 1..2;
  for my $table (@tables) {
      $table->set($_ => $_) for 1..20;
  }
  for my $table (@tables) {
      print $table->get($_) for 1..20;
  }

has a problem, since the temp pool in the sub is PADTMP SV, which means that perl will want to reuse the same SV everytime the sub is entered. so what happens to the pool which can't be destroyed, but perl will overwrite it with a new data. I didn't actually run the test yet.

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

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to