Author: spadkins
Date: Wed Dec 12 08:39:17 2007
New Revision: 10418

Modified:
   p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm

Log:
attempt to resolve the constant calling of poe_event_loop_extension when there 
is not work to be done

Modified: p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm
==============================================================================
--- p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm        (original)
+++ p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm        Wed Dec 12 
08:39:17 2007
@@ -995,19 +995,37 @@
     my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
     $self->log({level=>2},"POE: poe_event_loop_extension\n") if 
$self->{options}{poe_trace};
     my $event_loop_extensions = $self->{event_loop_extensions};
-    my $async_event_added = 0;
+    my $async_events_added = 0;
     if ($event_loop_extensions && $#$event_loop_extensions > -1) {
-        my ($extension, $obj, $method, $args, $event_executed);
+        my ($extension, $obj, $method, $args, $events_executed);
         for (my $i = 0; $i <= $#$event_loop_extensions; $i++) {
             $extension = $event_loop_extensions->[$i];
             ($obj, $method, $args) = @$extension;
-            $event_executed = $obj->$method(@$args);  # execute extension
-            $async_event_added = 1 if ($event_executed);
+            $events_executed = $obj->$method(@$args);  # execute extension
+            $async_events_added += $events_executed;
         }
     }
     $self->poe_yield($kernel, "poe_dispatch_pending_async_events", undef, 
"poe_event_loop_extension");
-    ### TODO: Do we want to constrain this if there is nothing to do (to 
prevent spinning unnecessary cycles)?
-    $kernel->yield("poe_event_loop_extension");
+
+    ### We want to delay this if there is nothing to do (to prevent spinning 
unnecessary cycles constantly)
+
+    ### This was a bad first attempt, for some reason it always delayed,
+    ### even when there was splitting work to be done
+    #$self->log({level=>2}, "Server : poe_event_loop_extension : 
async_events_added[$async_events_added] pending_async_events[" . 
@{$self->{pending_async_events}} . "]\n");
+    #if ($async_events_added || @{$self->{pending_async_events}} > 0) {
+
+    ### This attempt keeps the splitting running, but when work finishes
+    ### some capacity on a node might go underutilized until the delay passes
+    ### Another downside is it tightly couples this implementation in an 
abstract class
+    $self->log({level=>2}, "Server : poe_event_loop_extension : 
async_events_added[$async_events_added] clear_pending[" . 
$self->count_in_pending_async_events("mvworkd", 
"_clear_pending_hotel_shop_requests") . "]\n");
+    if ($async_events_added || $self->count_in_pending_async_events("mvworkd", 
"_clear_pending_hotel_shop_requests") > 0) {
+        $kernel->yield("poe_event_loop_extension");
+    }
+    else {
+        my $delay = .5;
+        $self->log({level=>2}, "Server : poe_event_loop_extension : delaying 
$delay seconds\n");
+        $kernel->delay_set("poe_event_loop_extension", $delay);
+    }
 
     &App::sub_exit() if ($App::trace);
 }

Reply via email to