Author: spadkins
Date: Wed Dec 12 11:48:50 2007
New Revision: 10419

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

Log:
considerable reworking of the handoffs between context and work controllers and 
work queue, unifying the way different layers queue up work to be done and 
recognize that they have new work

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 
11:48:50 2007
@@ -409,6 +409,7 @@
             && $unique_event_method
             && ($self->count_in_pending_async_events($unique_event_name, 
$unique_event_method) <= $count)) ) {
         push(@{$self->{pending_async_events}}, [ $event, $callback_event ]);
+        $self->poe_yield($self->{poe_kernel}, 
"poe_dispatch_pending_async_events");
     }
 
     &App::sub_exit($event_token) if ($App::trace);
@@ -840,17 +841,14 @@
 
 sub poe_yield {
     &App::sub_entry if ($App::trace);
-    my ($self, $kernel, $state, $max_count, $calling_code) = @_;
+    my ($self, $kernel, $state, $max_count) = @_;
 
+    my $count = $self->{poe_count}{$state} || 0;
     $max_count ||= 1;
-    if (!defined($self->{poe_count}{$state})) {
-        $self->{poe_count}{$state} = 1;
-    }
-    else {
-        $self->{poe_count}{$state}++;
-    }    
-    if ($self->{poe_count}{$state} <= $max_count) {
-        $kernel->yield($state, $calling_code);
+    if ($count < $max_count) {
+        $count++;
+        $self->{poe_count}{$state} = $count;
+        $kernel->yield($state);
     }
 
     &App::sub_exit() if ($App::trace);
@@ -923,7 +921,8 @@
     
     ### This is mostly for the node, which needs this to spawn queued execute 
subrequest events
     ### without it, subrequests get acquired by the node never spawns children 
to shop it
-    $kernel->yield("poe_dispatch_pending_async_events");
+    $self->poe_yield($kernel, "poe_dispatch_pending_async_events");
+    $self->poe_yield($kernel, "poe_event_loop_extension");
     
     my $time = time();
     my (@events);
@@ -994,6 +993,7 @@
     &App::sub_entry if ($App::trace);
     my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
     $self->log({level=>2},"POE: poe_event_loop_extension\n") if 
$self->{options}{poe_trace};
+    $self->poe_yield_acknowledged("poe_event_loop_extension");
     my $event_loop_extensions = $self->{event_loop_extensions};
     my $async_events_added = 0;
     if ($event_loop_extensions && $#$event_loop_extensions > -1) {
@@ -1005,7 +1005,6 @@
             $async_events_added += $events_executed;
         }
     }
-    $self->poe_yield($kernel, "poe_dispatch_pending_async_events", undef, 
"poe_event_loop_extension");
 
     ### We want to delay this if there is nothing to do (to prevent spinning 
unnecessary cycles constantly)
 
@@ -1018,18 +1017,22 @@
     ### 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);
+    #if ($async_events_added || 
$self->count_in_pending_async_events("mvworkd", 
"_clear_pending_hotel_shop_requests") > 0) {
+    if ($async_events_added) {
+        $self->poe_yield($kernel, "poe_dispatch_pending_async_events");
+        $self->poe_yield($kernel, "poe_event_loop_extension");
     }
 
     &App::sub_exit() if ($App::trace);
 }
 
+sub trigger_event_loop_extension {
+    &App::sub_entry if ($App::trace);
+    my ($self) = @_;
+    $self->poe_yield($self->{poe_kernel}, "poe_event_loop_extension");
+    &App::sub_exit() if ($App::trace);
+}
+
 sub poe_run_event {
     &App::sub_entry if ($App::trace);
     my ( $self, $kernel, $heap, $event ) = @_[ OBJECT, KERNEL, HEAP, ARG0 ];

Reply via email to