Hey,

For the sake of thread completion, here's a script which demonstrates 
the bug.  It turns out to be a Perl bug (5.6.1, at least), not an 
Apache::Session bug.  I'll post to p5p after I post here.

Note that $foo and %bar are cleaned up by refcount, but %foo isn't 
cleaned up until global destruction.  This means there must be some bad 
interaction between tie(), closures, and global variables, I guess.

-------------------------------------------------------------
#!/usr/bin/perl

use strict;

{
   package Dummy;
   sub new { bless {@_[1,2]} }
   sub TIEHASH { bless {@_[1,2]} }
   sub DESTROY { warn "Destroying $_[0]->{name}: $_[0]" }
}

use vars qw(%foo $foo);

{
   # Will get cleaned up properly
   local $foo = new Dummy(name => '$foo');

   # Will get cleaned up properly
   my %bar;
   tie %bar, 'Dummy', name => '%bar';

   # Won't get cleaned up properly
   local %foo;
   tie %foo, 'Dummy', name => '%foo';
}
------------------------------------------------------------
Destroying %bar: Dummy=HASH(0x632c) at destroy.pl line 9.
Destroying $foo: Dummy=HASH(0x641c) at destroy.pl line 9.
Destroying %foo: Dummy=HASH(0x22ccc) at destroy.pl line 9 during global 
destruction.
------------------------------------------------------------

Investigating with Devel::Peek suggests that it's a %foo refcount 
problem, it's somehow getting set to 2 after tie(%foo).

  -Ken

Reply via email to