From: Tomas Doran Date: Thu, 23 Sep 2010 15:04:17 +0000 (+0000) Subject: Bug fix for ctx_request, via matso++ X-Git-Tag: 5.80028~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=7f891e1e543fbe6c383fe51a6917126c159534f5 Bug fix for ctx_request, via matso++ --- diff --git a/Changes b/Changes index 90533cb..3d3669a 100644 --- a/Changes +++ b/Changes @@ -3,6 +3,9 @@ Bug fixes: - use Class::MOP in Catalyst::Utils. + - Do not keep a reference to a closed over context in ctx_request, allowing + the caller to dispose of the request context at their leisure. + 5.80027 2010-09-01 22:14:00 Bug fixes: diff --git a/lib/Catalyst/Test.pm b/lib/Catalyst/Test.pm index 397e98d..d0977a3 100644 --- a/lib/Catalyst/Test.pm +++ b/lib/Catalyst/Test.pm @@ -44,7 +44,7 @@ my $build_exports = sub { ### place holder for $c after the request finishes; reset every time ### requests are done. - my $c; + my $ctx_closed_over; ### hook into 'dispatch' -- the function gets called after all plugins ### have done their work, and it's an easy place to capture $c. @@ -52,7 +52,7 @@ my $build_exports = sub { my $meta = Class::MOP::get_metaclass_by_name($class); $meta->make_mutable; $meta->add_after_method_modifier( "dispatch", sub { - $c = shift; + $ctx_closed_over = shift; }); $meta->make_immutable( replace_constructor => 1 ); Class::C3::reinitialize(); # Fixes RT#46459, I've failed to write a test for how/why, but it does. @@ -60,8 +60,18 @@ my $build_exports = sub { ### we've already stopped it from doing remote requests above. my $res = $request->( @_ ); + # Make sure not to leave a reference $ctx hanging around. + # This means that the context will go out of scope as soon as the + # caller disposes of it, rather than waiting till the next time + # that ctx_request is called. This can be important if your $ctx + # ends up with a reference to a shared resource or lock (for example) + # which you want to clean up in test teardown - if the $ctx is still + # closed over then you're stuffed... + my $ctx = $ctx_closed_over; + undef $ctx_closed_over; + ### return both values - return ( $res, $c ); + return ( $res, $ctx ); }; return {