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
@[EMAIL PROTECTED]
-409,6 +409,7 @[EMAIL PROTECTED]
&& $unique_event_method
&& ($self->count_in_pending_async_events($unique_event_name,
$unique_event_method) <= $count)) ) {
push(@[EMAIL PROTECTED]
>{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);
@[EMAIL PROTECTED]
-840,17 +841,14 @[EMAIL PROTECTED]
sub poe_yield {
&App::sub_entry if ($App::trace);
- my ($self, $kernel, $state, $max_count, $calling_code) = @[EMAIL PROTECTED]
my ($self, $kernel, $state, $max_count) = @[EMAIL PROTECTED]
+ 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);
@[EMAIL PROTECTED]
-923,7 +921,8 @[EMAIL PROTECTED]
### 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 (@[EMAIL PROTECTED]
);
@[EMAIL PROTECTED]
-994,6 +993,7 @[EMAIL PROTECTED]
&App::sub_entry if ($App::trace);
my ( $self, $kernel, $heap ) = @[EMAIL PROTECTED]
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) {
@[EMAIL PROTECTED]
-1005,7 +1005,6 @[EMAIL PROTECTED]
$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)
@[EMAIL PROTECTED]
-1018,18 +1017,22 @[EMAIL PROTECTED]
### 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) = @[EMAIL PROTECTED]
$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 ) = @[EMAIL PROTECTED]
OBJECT, KERNEL, HEAP, ARG0
];


|