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);
}