Hello POEple.

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:

Reply via email to