http://poe.perl.org/?POE_RFCs/Revise_call mentions adding a POE::Session->call() method, in part of the revision of call. This new session method is intended to deny cross-session calls, which as a side effect allows extended optimization of call() bypassing garbage collection checks, as it is forced to return to a state within the same session.
After a little testing and a little thinking, I realized this could be used to speed up current POE as a whole, by utilizing this new session call() method in the POE::Wheels. So I decided to impliment this method. My personal benchmarks show it is in fact considerably faster.
Benchmark: timing 1000000 iterations of POE::Kernel->call(), POE::Session->call() ...
POE::Kernel->call(): 60 wallclock secs (50.39 usr + 0.22 sys = 50.61 CPU) @ 19758.94/s (n=1000000)
POE::Session->call(): 29 wallclock secs (25.64 usr + 0.01 sys = 25.65 CPU) @ 38986.35/s (n=1000000)
With these changes applied, all tests pass on my system.
All tests successful, 12 subtests skipped.
Files=40, Tests=3171, 101 wallclock secs (12.45 cusr + 0.49 csys = 12.94 CPU)
Attached is the code used for this benchmark, as well as patches which add the call() method to POE::Session, and also utilize this method in all of the current POE::Wheels packaged with the POE distribution, and the output of the test suite. If anyone has any doubts as to weither or not this is in fact a good idea, or if anyone has any objections or conditions of its implimentation prior to being applied to the current cvs tree, please let me know. I will try to meet all prerequesites, as I would like to see this patch applied in the next release.
- Scott
Common subdirectories: poe/lib/POE/API and poe.session.call/lib/POE/API Common subdirectories: poe/lib/POE/Attribute and poe.session.call/lib/POE/Attribute Common subdirectories: poe/lib/POE/CVS and poe.session.call/lib/POE/CVS Common subdirectories: poe/lib/POE/Component and poe.session.call/lib/POE/Component Common subdirectories: poe/lib/POE/Driver and poe.session.call/lib/POE/Driver Common subdirectories: poe/lib/POE/Filter and poe.session.call/lib/POE/Filter Only in poe.session.call/lib/POE: Kernel.pm.mine Common subdirectories: poe/lib/POE/Loop and poe.session.call/lib/POE/Loop Common subdirectories: poe/lib/POE/Macro and poe.session.call/lib/POE/Macro diff -u poe/lib/POE/NFA.pm poe.session.call/lib/POE/NFA.pm --- poe/lib/POE/NFA.pm 2004-01-05 14:37:36.000000000 -0800 +++ poe.session.call/lib/POE/NFA.pm 2004-02-07 22:14:09.000000000 -0800 @@ -220,6 +220,29 @@ } #------------------------------------------------------------------------------ +# Session Call +sub call { + my ($file, $line, $self, $state, @etc) = ((caller)[1,2], @_); + + unless ($POE::Kernel::poe_kernel->get_active_session() eq $self) { + my $session_alias = $POE::Kernel::poe_kernel->_data_alias_loggable($self); + POE::Kernel::_croak($session_alias, "->call() failed, ", $session_alias, + "is not the active session"); + } + + my $return; + if (wantarray) { + $return = + [ $self->_invoke_state($self, $state, [EMAIL PROTECTED], $file, $line) ]; + } + else { + $return = + $self->_invoke_state($self, $state, [EMAIL PROTECTED], $file, $line); + } + + return $return unless wantarray; + return @$return; +} sub _invoke_state { my ($self, $sender, $event, $args, $file, $line) = @_; Common subdirectories: poe/lib/POE/Pipe and poe.session.call/lib/POE/Pipe Common subdirectories: poe/lib/POE/Queue and poe.session.call/lib/POE/Queue Common subdirectories: poe/lib/POE/Repository and poe.session.call/lib/POE/Repository Common subdirectories: poe/lib/POE/Resource and poe.session.call/lib/POE/Resource diff -u poe/lib/POE/Session.pm poe.session.call/lib/POE/Session.pm --- poe/lib/POE/Session.pm 2004-01-05 14:37:36.000000000 -0800 +++ poe.session.call/lib/POE/Session.pm 2004-02-07 22:11:34.000000000 -0800 @@ -566,6 +566,28 @@ } #------------------------------------------------------------------------------ +sub call { + my ($file, $line, $self, $state, @etc) = ((caller)[1,2], @_); + + unless ($POE::Kernel::poe_kernel->get_active_session() eq $self) { + my $session_alias = $POE::Kernel::poe_kernel->_data_alias_loggable($self); + POE::Kernel::_croak($session_alias, "->call() failed, ", $session_alias, + "is not the active session"); + } + + my $return; + if (wantarray) { + $return = + [ $self->_invoke_state($self, $state, [EMAIL PROTECTED], $file, $line) ]; + } + else { + $return = + $self->_invoke_state($self, $state, [EMAIL PROTECTED], $file, $line); + } + + return $return unless wantarray; + return @$return; +} sub _invoke_state { my ($self, $source_session, $state, $etc, $file, $line) = @_; @@ -1265,6 +1287,17 @@ print "$option = $old_value\n"; } +=item call EVENT_NAME, PARAMETER_LIST + +call() invokes the event passed immediately, skipping all garbage +collection routines. + +call() returns whatever EVENT_NAME's handler does. The call() call's +status is returned in $!, which is 0 for success or a nonzero reason +for failure. + +call() will fail if it not called on the active session object. + =item postback EVENT_NAME, PARAMETER_LIST postback() creates anonymous coderefs which, when called, post Common subdirectories: poe/lib/POE/Wheel and poe.session.call/lib/POE/Wheel
Common subdirectories: poe/lib/POE/Wheel/CVS and poe.session.call/lib/POE/Wheel/CVS diff -u poe/lib/POE/Wheel/Curses.pm poe.session.call/lib/POE/Wheel/Curses.pm --- poe/lib/POE/Wheel/Curses.pm 2003-11-20 21:08:26.000000000 -0800 +++ poe.session.call/lib/POE/Wheel/Curses.pm 2004-02-07 21:45:28.000000000 -0800 @@ -96,7 +96,7 @@ # determined that STDIN has something for us. Be explicit # about which getch() to use. while ((my $keystroke = Curses::getch) ne '-1') { - $k->call( $me, $$event_input, $keystroke, $unique_id ); + $me->call( $$event_input, $keystroke, $unique_id ); } } ); diff -u poe/lib/POE/Wheel/FollowTail.pm poe.session.call/lib/POE/Wheel/FollowTail.pm --- poe/lib/POE/Wheel/FollowTail.pm 2004-01-28 15:19:11.000000000 -0800 +++ poe.session.call/lib/POE/Wheel/FollowTail.pm 2004-02-07 21:45:10.000000000 -0800 @@ -257,7 +257,7 @@ TRACE_POLL and warn time . " raw input"; foreach my $cooked_input (@{$filter->get($raw_input)}) { TRACE_POLL and warn time . " cooked input"; - $k->call($ses, $$event_input, $cooked_input, $unique_id); + $ses->call($$event_input, $cooked_input, $unique_id); } } } @@ -268,7 +268,7 @@ if ($! or (-S $handle) or (-t $handle)) { TRACE_POLL and warn time . " error: $!"; $$event_error and - $k->call($ses, $$event_error, 'read', ($!+0), $!, $unique_id); + $ses->call($$event_error, 'read', ($!+0), $!, $unique_id); $k->select($handle); } eval { IO::Handle::clearerr($handle) }; # could be a globref @@ -326,7 +326,7 @@ # File shrank. Consider it a reset. Seek to the top of # the file. if ($new_stat[7] < $last_stat->[7]) { - $$event_reset and $k->call($ses, $$event_reset, $unique_id); + $$event_reset and $ses->call($$event_reset, $unique_id); sysseek($handle, 0, SEEK_SET); } @@ -357,7 +357,7 @@ close $handle; unless (open $handle, "<$filename") { $$event_error and - $k->call( $ses, $$event_error, 'reopen', + $ses->call( $$event_error, 'reopen', ($!+0), $!, $unique_id ); } @@ -375,7 +375,7 @@ TRACE_POLL and warn time . " raw input\n"; foreach my $cooked_input (@{$filter->get($raw_input)}) { TRACE_POLL and warn time . " cooked input\n"; - $k->call($ses, $$event_input, $cooked_input, $unique_id); + $ses->call($$event_input, $cooked_input, $unique_id); } } $k->yield($state_read); @@ -387,7 +387,7 @@ if ($!) { TRACE_POLL and warn time . " error: $!\n"; $$event_error and - $k->call($ses, $$event_error, 'read', ($!+0), $!, $unique_id); + $ses->call($$event_error, 'read', ($!+0), $!, $unique_id); $k->select($handle); } $k->delay($state_read, $poll_interval); diff -u poe/lib/POE/Wheel/ListenAccept.pm poe.session.call/lib/POE/Wheel/ListenAccept.pm --- poe/lib/POE/Wheel/ListenAccept.pm 2003-11-25 19:52:07.000000000 -0800 +++ poe.session.call/lib/POE/Wheel/ListenAccept.pm 2004-02-07 21:44:18.000000000 -0800 @@ -115,11 +115,11 @@ my $peer = accept($new_socket, $handle); if ($peer) { - $k->call($me, $$event_accept, $new_socket, $peer, $unique_id); + $me->call($$event_accept, $new_socket, $peer, $unique_id); } elsif ($! != EWOULDBLOCK) { $$event_error && - $k->call($me, $$event_error, 'accept', ($!+0), $!, $unique_id); + $me->call($$event_error, 'accept', ($!+0), $!, $unique_id); } } ); diff -u poe/lib/POE/Wheel/ReadWrite.pm poe.session.call/lib/POE/Wheel/ReadWrite.pm --- poe/lib/POE/Wheel/ReadWrite.pm 2004-01-24 17:54:58.000000000 -0800 +++ poe.session.call/lib/POE/Wheel/ReadWrite.pm 2004-02-07 21:39:56.000000000 -0800 @@ -206,7 +206,7 @@ # When you can't write, nothing else matters. if ($!) { - $$event_error && $k->call( $me, $$event_error, + $$event_error && $me->call( $$event_error, 'write', ($!+0), $!, $unique_id ); $k->select_write($handle); @@ -222,7 +222,7 @@ if ($$is_in_high_water_state) { if ( $$driver_buffered_out_octets <= $low_mark ) { $$is_in_high_water_state = 0; - $k->call( $me, $$event_low, $unique_id ) if defined $$event_low; + $me->call( $$event_low, $unique_id ) if defined $$event_low; } } @@ -236,7 +236,7 @@ ( $$driver_buffered_out_octets >= $high_mark ) ) { $$is_in_high_water_state = 1; - $k->call( $me, $$event_high, $unique_id ) if defined $$event_high; + $me->call( $$event_high, $unique_id ) if defined $$event_high; } } @@ -246,7 +246,7 @@ # is 1). unless ($$driver_buffered_out_octets) { $k->select_pause_write($handle); - $$event_flushed && $k->call($me, $$event_flushed, $unique_id); + $$event_flushed && $me->call($$event_flushed, $unique_id); } } ); @@ -299,13 +299,13 @@ my $next_rec = $$input_filter->get_one(); last unless @$next_rec; foreach my $cooked_input (@$next_rec) { - $k->call($me, $$event_input, $cooked_input, $unique_id); + $me->call($$event_input, $cooked_input, $unique_id); } } } else { $$event_error and - $k->call( $me, $$event_error, 'read', ($!+0), $!, $unique_id ); + $me->call( $$event_error, 'read', ($!+0), $!, $unique_id ); $k->select_read($handle); } } @@ -327,12 +327,12 @@ my ($k, $me, $handle) = @_[KERNEL, SESSION, ARG0]; if (defined(my $raw_input = $driver->get($handle))) { foreach my $cooked_input (@{$$input_filter->get($raw_input)}) { - $k->call($me, $$event_input, $cooked_input, $unique_id); + $me->call($$event_input, $cooked_input, $unique_id); } } else { $$event_error and - $k->call( $me, $$event_error, 'read', ($!+0), $!, $unique_id ); + $me->call( $$event_error, 'read', ($!+0), $!, $unique_id ); $k->select_read($handle); } } @@ -478,10 +478,8 @@ my $next_rec = $self->[FILTER_INPUT]->get_one(); last unless @$next_rec; foreach my $cooked_input (@$next_rec) { - $poe_kernel->call( $poe_kernel->get_active_session(), - $self->[EVENT_INPUT], - $cooked_input, $self->[UNIQUE_ID] - ); + $poe_kernel->get_active_session()->call + ( $self->[EVENT_INPUT], $cooked_input, $self->[UNIQUE_ID] ); } } } @@ -491,10 +489,8 @@ else { if (defined $buf) { foreach my $cooked_input (@{$self->[FILTER_INPUT]->get($buf)}) { - $poe_kernel->call( $poe_kernel->get_active_session(), - $self->[EVENT_INPUT], - $cooked_input, $self->[UNIQUE_ID] - ); + $poe_kernel->get_active_session()->calli + ( $self->[EVENT_INPUT], $cooked_input, $self->[UNIQUE_ID] ); } } } diff -u poe/lib/POE/Wheel/Run.pm poe.session.call/lib/POE/Wheel/Run.pm --- poe/lib/POE/Wheel/Run.pm 2004-01-28 15:19:13.000000000 -0800 +++ poe.session.call/lib/POE/Wheel/Run.pm 2004-02-07 21:47:51.000000000 -0800 @@ -512,7 +512,7 @@ # When you can't write, nothing else matters. if ($!) { - $$error_event && $k->call( $me, $$error_event, + $$error_event && $me->call( $$error_event, 'write', ($!+0), $!, $unique_id, "STDIN" ); $k->select_write($handle); @@ -525,7 +525,7 @@ # All chunks written; fire off a "flushed" event. unless ($$stdin_octets) { $k->select_pause_write($handle); - $$stdin_event && $k->call($me, $$stdin_event, $unique_id); + $$stdin_event && $me->call($$stdin_event, $unique_id); } } } @@ -577,17 +577,17 @@ my $next_rec = $stdout_filter->get_one(); last unless @$next_rec; foreach my $cooked_input (@$next_rec) { - $k->call($me, $$stdout_event, $cooked_input, $unique_id); + $me->call($$stdout_event, $cooked_input, $unique_id); } } } else { $$error_event and - $k->call( $me, $$error_event, + $me->call( $$error_event, 'read', ($!+0), $!, $unique_id, 'STDOUT' ); unless (--$$is_active) { - $k->call( $me, $$close_event, $unique_id ) + $me->call( $$close_event, $unique_id ) if defined $$close_event; } $k->select_read($handle); @@ -608,16 +608,16 @@ my ($k, $me, $handle) = @_[KERNEL, SESSION, ARG0]; if (defined(my $raw_input = $driver->get($handle))) { foreach my $cooked_input (@{$stdout_filter->get($raw_input)}) { - $k->call($me, $$stdout_event, $cooked_input, $unique_id); + $me->call($$stdout_event, $cooked_input, $unique_id); } } else { $$error_event and - $k->call( $me, $$error_event, + $me->call( $$error_event, 'read', ($!+0), $!, $unique_id, 'STDOUT' ); unless (--$$is_active) { - $k->call( $me, $$close_event, $unique_id ) + $me->call( $$close_event, $unique_id ) if defined $$close_event; } $k->select_read($handle); @@ -673,17 +673,17 @@ my $next_rec = $stderr_filter->get_one(); last unless @$next_rec; foreach my $cooked_input (@$next_rec) { - $k->call($me, $$stderr_event, $cooked_input, $unique_id); + $me->call($$stderr_event, $cooked_input, $unique_id); } } } else { $$error_event and - $k->call( $me, $$error_event, + $me->call( $$error_event, 'read', ($!+0), $!, $unique_id, 'STDERR' ); unless (--$$is_active) { - $k->call( $me, $$close_event, $unique_id ) + $me->call( $$close_event, $unique_id ) if defined $$close_event; } $k->select_read($handle); @@ -704,16 +704,16 @@ my ($k, $me, $handle) = @_[KERNEL, SESSION, ARG0]; if (defined(my $raw_input = $driver->get($handle))) { foreach my $cooked_input (@{$stderr_filter->get($raw_input)}) { - $k->call($me, $$stderr_event, $cooked_input, $unique_id); + $me->call($$stderr_event, $cooked_input, $unique_id); } } else { $$error_event and - $k->call( $me, $$error_event, + $me->call( $$error_event, 'read', ($!+0), $!, $unique_id, 'STDERR' ); unless (--$$is_active) { - $k->call( $me, $$close_event, $unique_id ) + $me->call( $$close_event, $unique_id ) if defined $$close_event; } $k->select_read($handle); @@ -898,10 +898,8 @@ my $next_rec = $old_output_filter->get_one(); last unless @$next_rec; foreach my $cooked_input (@$next_rec) { - $poe_kernel->call( $poe_kernel->get_active_session(), - $self->[EVENT_STDOUT], - $cooked_input, $self->[UNIQUE_ID] - ); + $poe_kernel->get_active_session()->call + ( $self->[EVENT_STDOUT], $cooked_input, $self->[UNIQUE_ID] ); } } } @@ -909,10 +907,8 @@ # Otherwise use the old get() behavior. else { foreach my $cooked_input (@{$self->[FILTER_STDOUT]->get($buf)}) { - $poe_kernel->call( $poe_kernel->get_active_session(), - $self->[EVENT_STDOUT], - $cooked_input, $self->[UNIQUE_ID] - ); + $poe_kernel->get_active_session()->call + ( $self->[EVENT_STDOUT], $cooked_input, $self->[UNIQUE_ID] ); } } } @@ -940,10 +936,8 @@ my $next_rec = $old_output_filter->get_one(); last unless @$next_rec; foreach my $cooked_input (@$next_rec) { - $poe_kernel->call( $poe_kernel->get_active_session(), - $self->[EVENT_STDERR], - $cooked_input, $self->[UNIQUE_ID] - ); + $poe_kernel->get_active_session()->call + ( $self->[EVENT_STDERR], $cooked_input, $self->[UNIQUE_ID] ); } } } @@ -951,10 +945,8 @@ # Otherwise use the old get() behavior. else { foreach my $cooked_input (@{$self->[FILTER_STDERR]->get($buf)}) { - $poe_kernel->call( $poe_kernel->get_active_session(), - $self->[EVENT_STDERR], - $cooked_input, $self->[UNIQUE_ID] - ); + $poe_kernel->get_active_session()->call + ( $self->[EVENT_STDERR], $cooked_input, $self->[UNIQUE_ID] ); } } } diff -u poe/lib/POE/Wheel/SocketFactory.pm poe.session.call/lib/POE/Wheel/SocketFactory.pm --- poe/lib/POE/Wheel/SocketFactory.pm 2003-11-25 19:52:07.000000000 -0800 +++ poe.session.call/lib/POE/Wheel/SocketFactory.pm 2004-02-07 21:48:20.000000000 -0800 @@ -204,14 +204,14 @@ else { die "sanity failure: socket domain == $domain"; } - $k->call( $me, $$event_success, + $me->call( $$event_success, $new_socket, $peer_addr, $peer_port, $unique_id ); } elsif ($! != EWOULDBLOCK) { $$event_failure && - $k->call( $me, $$event_failure, + $me->call( $$event_failure, 'accept', ($!+0), $!, $unique_id ); } @@ -271,7 +271,7 @@ $! = unpack('i', getsockopt($handle, SOL_SOCKET, SO_ERROR)); if ($!) { (defined $$event_failure) and - $k->call( $me, $$event_failure, + $me->call( $$event_failure, 'connect', ($!+0), $!, $unique_id ); return; @@ -281,7 +281,7 @@ my $peer = getpeername($handle); if ($!) { (defined $$event_failure) and - $k->call( $me, $$event_failure, + $me->call( $$event_failure, 'getpeername', ($!+0), $!, $unique_id ); return; @@ -330,7 +330,7 @@ } # Tell the session it went okay. Also let go of the socket. - $k->call( $me, $$event_success, + $me->call( $$event_success, $handle, $peer_addr, $peer_port, $unique_id ); } @@ -361,7 +361,7 @@ $! = unpack('i', getsockopt($handle, SOL_SOCKET, SO_ERROR)); if ($!) { (defined $$event_failure) and - $k->call( $me, $$event_failure, + $me->call( $$event_failure, 'connect', ($!+0), $!, $unique_id ); return;
#!/usr/bin/perl -l
use warnings FATAL => "all"; use strict; use POE; use Benchmark; create POE::Session inline_states => { _start => sub { $_[KERNEL]->yield("StartTest"); }, StartTest => sub { my ($kernel, $session) = @_[ KERNEL, SESSION ]; timethese 1_000_000, { "POE::Session->call()" => sub { $session->call("Tick"); }, "POE::Kernel->call()" => sub { $kernel->call($session, "Tick"); }, }; }, Tick => sub { "Boink!"; }, }; run POE::Kernel;
<ev> enqueued event 1 ``_stat_tick'' from session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) to session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at 1076220833.91736 at lib/POE/Resource/Events.pm line 72 <rc> incrementing refcount for session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 353 <rc> incrementing refcount for session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 353 <ev> enqueued event 2 ``_sigchld_poll'' from session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) to session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at 1076220804.9181 at lib/POE/Resource/Events.pm line 72 <rc> incrementing refcount for session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 353 <rc> incrementing refcount for session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 353 <ss> session 2 (POE::Session=ARRAY(0x83f6aa0)) has parent session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 90 <rc> incrementing refcount for session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 353 <ss> session 3 (POE::Session=ARRAY(0x83f6ad0)) has parent session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 90 <rc> incrementing refcount for session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 353 <sg> stopping signaled session session 3 (POE::Session=ARRAY(0x83f6ad0)) at lib/POE/Resource/Signals.pm line 262 <ss> stopping session 3 (POE::Session=ARRAY(0x83f6ad0)) at lib/POE/Resource/Sessions.pm line 461 <ev> Dispatching event -494 ``_child'' (lose POE::Session=ARRAY(0x83f6ad0)) from session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) to session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Kernel.pm line 694 <ev> dispatching event -494 ``_child'' to session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Kernel.pm line 824 <ev> event -494 ``_child'' returns (0) <ev> Dispatching event -503 ``_stop'' () from session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) to session 3 (POE::Session=ARRAY(0x83f6ad0)) at lib/POE/Kernel.pm line 694 <ev> dispatching event -503 ``_stop'' to session 3 (POE::Session=ARRAY(0x83f6ad0)) at lib/POE/Kernel.pm line 824 <ev> event -503 ``_stop'' returns (undef) <ss> freeing session 3 (POE::Session=ARRAY(0x83f6ad0)) at lib/POE/Resource/Sessions.pm line 114 <ss> removed session 3 (POE::Session=ARRAY(0x83f6ad0)) from session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 150 POE::Kernel::_data_ses_free('POE::Kernel=ARRAY(0x83417c4)','POE::Session=ARRAY(0x83f6ad0)') called at lib/POE/Resource/Sessions.pm line 507 POE::Kernel::_data_ses_stop('POE::Kernel=ARRAY(0x83417c4)','POE::Session=ARRAY(0x83f6ad0)') called at lib/POE/Resource/Signals.pm line 269 POE::Kernel::_data_sig_free_terminated_sessions('POE::Kernel=ARRAY(0x83417c4)') called at t/res/signals.t line 254 <rc> decrementing refcount for session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 322 <rc> testing for idle session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) at lib/POE/Resource/Sessions.pm line 381 <rc> +----- GC test for session asus-4025d383000017e9 (POE::Kernel=ARRAY(0x83417c4)) (POE::Kernel=ARRAY(0x83417c4)) ----- <rc> | total refcnt : 5 <rc> | event count : 2 <rc> | post count : 2 <rc> | child sessions: 1 <rc> | handles in use: 0 <rc> | aliases in use: 0 <rc> | extra refs : 0 <rc> +--------------------------------------------------- ----- Session POE::Session=ARRAY(0x83f6ad0) Leak Check ----- -- Namespace (HEAP): $VAR1 = undef; -- Options: -- States: ----- Session POE::Session=ARRAY(0x83f6aa0) Leak Check ----- -- Namespace (HEAP): $VAR1 = undef; -- Options: -- States: