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 ];