stas 2004/05/14 00:40:31
Modified: t/response/TestAPR pool.pm
xs/APR/Pool APR__Pool.h
xs/maps apr_functions.map
xs/tables/current/ModPerl FunctionTable.pm
Log:
APR::Pool now has destroy() and clear() available + tests
Revision Changes Path
1.11 +56 -26 modperl-2.0/t/response/TestAPR/pool.pm
Index: pool.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/response/TestAPR/pool.pm,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -u -r1.10 -r1.11
--- pool.pm 14 May 2004 02:58:41 -0000 1.10
+++ pool.pm 14 May 2004 07:40:31 -0000 1.11
@@ -16,11 +16,11 @@
sub handler {
my $r = shift;
- plan $r, tests => 66;
+ plan $r, tests => 75;
### native pools ###
- # explicit DESTROY shouldn't destroy native pools
+ # explicit destroy shouldn't destroy native pools
{
my $p = $r->pool;
@@ -28,9 +28,9 @@
t_debug "\$r->pool has 2 or more ancestors (found $count)";
ok $count >= 2;
- $p->cleanup_register(\&set_cleanup, [$r, 'native DESTROY']);
+ $p->cleanup_register(\&set_cleanup, [$r, 'native destroy']);
- $p->DESTROY;
+ $p->destroy;
my @notes = $r->notes->get('cleanup');
@@ -63,23 +63,23 @@
### custom pools ###
- # test: explicit pool object DESTROY destroys the custom pool
+ # test: explicit pool object destroy destroys the custom pool
{
my $p = APR::Pool->new;
- $p->cleanup_register(\&set_cleanup, [$r, 'new DESTROY']);
+ $p->cleanup_register(\&set_cleanup, [$r, 'new destroy']);
ok t_cmp(1, ancestry_count($p),
"a new pool has one ancestor: the global pool");
- # explicity DESTROY the object
- $p->DESTROY;
+ # explicity destroy the object
+ $p->destroy;
my @notes = $r->notes->get('cleanup');
ok t_cmp(1, scalar(@notes), "should be 1 note");
- ok t_cmp('new DESTROY', $notes[0]);
+ ok t_cmp('new destroy', $notes[0]);
$r->notes->clear;
}
@@ -128,7 +128,7 @@
my ($pp, $sp) = both_pools_create_ok($r);
# destroying $pp should destroy the subpool $sp too
- $pp->DESTROY;
+ $pp->destroy;
both_pools_destroy_ok($r);
@@ -141,8 +141,8 @@
{
my ($pp, $sp) = both_pools_create_ok($r);
- $sp->DESTROY;
- $pp->DESTROY;
+ $sp->destroy;
+ $pp->destroy;
both_pools_destroy_ok($r);
@@ -157,8 +157,8 @@
{
my ($pp, $sp) = both_pools_create_ok($r);
- $pp->DESTROY;
- $sp->DESTROY;
+ $pp->destroy;
+ $sp->destroy;
both_pools_destroy_ok($r);
@@ -173,7 +173,7 @@
my ($pp, $sp) = both_pools_create_ok($r);
# parent pool destroys child pool
- $pp->DESTROY;
+ $pp->destroy;
# this should "gracefully" fail, since $sp's guts were
# destroyed when the parent pool was destroyed
@@ -203,13 +203,13 @@
my $pp2;
{
my $pp = APR::Pool->new;
- $pp->DESTROY;
+ $pp->destroy;
# $pp2 ideally should take the exact place of apr_pool
# previously pointed to by $pp
$pp2 = APR::Pool->new;
# $pp object didn't go away yet (it'll when exiting this
# scope). in the previous implementation, $pp will be
- # DESTROY'ed second time on the exit of the scope and it
+ # destroyed second time on the exit of the scope and it
# could happen to work, because $pp2 pointer has allocated
# exactly the same address. and if so it would have killed
# the pool that $pp2 points to
@@ -226,7 +226,7 @@
# next make sure that $pp2's pool is still alive
$pp2->cleanup_register(\&set_cleanup, [$r, 'overtake']);
- $pp2->DESTROY;
+ $pp2->destroy;
my @notes = $r->notes->get('cleanup');
@@ -259,7 +259,7 @@
my $pp = APR::Pool->new;
my $sp = $pp->new;
# parent destroys $sp
- $pp->DESTROY;
+ $pp->destroy;
# hopefully these pool will take over the $pp and $sp
# allocations
@@ -272,7 +272,7 @@
$r->notes->clear;
# parent pool destroys child pool
- $pp2->DESTROY;
+ $pp2->destroy;
both_pools_destroy_ok($r);
@@ -300,7 +300,7 @@
$r->notes->clear;
# now the last copy is gone and the cleanup hooks will be called
- $cp->DESTROY;
+ $cp->destroy;
@notes = $r->notes->get('cleanup');
ok t_cmp(1, scalar(@notes), "should be 1 note");
@@ -308,7 +308,6 @@
$r->notes->clear;
}
-
{
# and another variation
my $pp = $r->pool->new;
@@ -318,14 +317,14 @@
my $pp2 = $sp->parent_get;
# parent destroys children
- $pp->DESTROY;
+ $pp->destroy;
# grand parent ($r->pool) is undestroyable (core pool)
- $gp->DESTROY;
+ $gp->destroy;
# now all custom pools are destroyed - $sp and $pp2 point nowhere
- $pp2->DESTROY;
- $sp->DESTROY;
+ $pp2->destroy;
+ $sp->destroy;
ok 1;
}
@@ -388,6 +387,37 @@
t_server_log_error_is_expected();
$p->cleanup_register(\&non_existing1, 1);
}
+
+ ### $p->clear ###
+ {
+ my ($pp, $sp) = both_pools_create_ok($r);
+ $pp->clear;
+ # both pools should have run their cleanups
+ both_pools_destroy_ok($r);
+
+ # sub-pool $sp should be now bogus, as clear() destroys
+ # subpools
+ eval { $sp->parent_get };
+ ok t_cmp(qr/invalid pool object/,
+ $@,
+ "clear destroys sub pools");
+
+ # now we should be able to use the parent pool without
+ # allocating it
+ $pp->cleanup_register(\&set_cleanup, [$r, 're-using pool']);
+ $pp->destroy;
+
+ my @notes = $r->notes->get('cleanup');
+ ok t_cmp('re-using pool', $notes[0]);
+
+ $r->notes->clear;
+ }
+
+
+
+
+
+
# other stuff
{
1.14 +33 -0 modperl-2.0/xs/APR/Pool/APR__Pool.h
Index: APR__Pool.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/APR/Pool/APR__Pool.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -u -r1.13 -r1.14
--- APR__Pool.h 14 May 2004 02:37:28 -0000 1.13
+++ APR__Pool.h 14 May 2004 07:40:31 -0000 1.14
@@ -155,6 +155,39 @@
}
}
+static MP_INLINE void mpxs_APR__Pool_clear(pTHX_ SV *obj)
+{
+ apr_pool_t *p = mp_xs_sv2_APR__Pool(obj);
+ mpxs_pool_account_t *data;
+
+ apr_pool_userdata_get((void **)&data, MP_APR_POOL_NEW, p);
+ if (!(data && data->sv)) {
+ MP_POOL_TRACE(MP_FUNC, "parent pool (0x%lx) is a core pool",
+ (unsigned long)p);
+ apr_pool_clear(p);
+ return;
+ }
+
+ MP_POOL_TRACE(MP_FUNC,
+ "parent pool (0x%lx) is a custom pool, sv 0x%lx",
+ (unsigned long)p,
+ (unsigned long)data->sv);
+
+ apr_pool_clear(p);
+
+ /* apr_pool_clear removes all the user data, so we need to restore
+ * it. Since clear triggers mpxs_apr_pool_cleanup call, our
+ * object's guts get nuked too, so we need to restore them too */
+
+ /* this is sv_setref_pv, but for an existing object */
+ sv_setiv(newSVrv(obj, "APR::Pool"), PTR2IV((void*)p));
+ data->sv = SvRV(obj);
+
+ /* reinstall the user data */
+ apr_pool_userdata_set(data, MP_APR_POOL_NEW, NULL, p);
+}
+
+
typedef struct {
SV *cv;
SV *arg;
1.74 +4 -2 modperl-2.0/xs/maps/apr_functions.map
Index: apr_functions.map
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/maps/apr_functions.map,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -u -r1.73 -r1.74
--- apr_functions.map 4 May 2004 06:14:44 -0000 1.73
+++ apr_functions.map 14 May 2004 07:40:31 -0000 1.74
@@ -156,9 +156,11 @@
MODULE=APR::Pool
-apr_pool_num_bytes | | p, recurse=0 #only available with -DAPR_POOL_DEBUG
apr_pool_cleanup_for_exec
- apr_pool_clear
+-apr_pool_clear
+mpxs_APR__Pool_clear
>apr_pool_clear_debug
- apr_pool_destroy
+-apr_pool_destroy
+ DEFINE_destroy | mpxs_apr_pool_DESTROY | SV *:obj
DEFINE_DESTROY | mpxs_apr_pool_DESTROY | SV *:obj
>apr_pool_destroy_debug
SV *:DEFINE_new | mpxs_apr_pool_create | SV *:parent_pool_obj
1.156 +19 -1 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm
Index: FunctionTable.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.155
retrieving revision 1.156
diff -u -u -r1.155 -r1.156
--- FunctionTable.pm 10 May 2004 20:11:02 -0000 1.155
+++ FunctionTable.pm 14 May 2004 07:40:31 -0000 1.156
@@ -2,7 +2,7 @@
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# ! WARNING: generated by ModPerl::ParseSource/0.01
-# ! Mon May 10 13:02:13 2004
+# ! Thu May 13 22:34:11 2004
# ! do NOT edit, any changes will be lost !
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -5430,6 +5430,24 @@
{
'type' => 'apr_bucket *',
'name' => 'bucket'
+ }
+ ]
+ },
+ {
+ 'return_type' => 'void',
+ 'name' => 'mpxs_APR__Pool_clear',
+ 'attr' => [
+ 'static',
+ '__inline__'
+ ],
+ 'args' => [
+ {
+ 'type' => 'PerlInterpreter *',
+ 'name' => 'my_perl'
+ },
+ {
+ 'type' => 'SV *',
+ 'name' => 'obj'
}
]
},