Author: spadkins
Date: Mon Nov 26 13:23:09 2007
New Revision: 10312
Modified:
p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm
Log:
added unique_event_name and unique_event_method parameters to send_async_event,
allowing for the event to only be in pending_async_events once (instead of
piling up, like _clear_pending_hotel_shop_requests was doing when splitting
20000 subrequests). this seems to allow other POE events to run without too
much delay, so we can split massive amounts of subrequests and still keep each
of the nodes busy doing 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 Mon Nov 26
13:23:09 2007
@@ -395,15 +395,39 @@
sub send_async_event {
&App::sub_entry if ($App::trace);
- my ($self, $event, $callback_event) = @_;
+ my ($self, $event, $callback_event, $unique_event_name,
$unique_event_method) = @_;
+
my $event_token = $self->new_event_token();
$event->{event_token} = $event_token;
$callback_event->{event_token} = $event_token if ($callback_event);
- push(@{$self->{pending_async_events}}, [ $event, $callback_event ]);
+ if ( ( !$unique_event_name
+ && !$unique_event_method)
+ || ( $unique_event_name
+ && $unique_event_method
+ && ($self->count_in_pending_async_events($unique_event_name,
$unique_event_method) <= 1)) ) {
+ push(@{$self->{pending_async_events}}, [ $event, $callback_event ]);
+ }
+
&App::sub_exit($event_token) if ($App::trace);
return($event_token);
}
+sub count_in_pending_async_events {
+ &App::sub_entry if ($App::trace);
+ my ($self, $event_name, $event_method) = @_;
+
+ my $count = 0;
+ for my $pending_event (@{$self->{pending_async_events}}) {
+ if ( ($pending_event->[0]->{name} eq $event_name)
+ && ($pending_event->[0]->{method} eq $event_method) ) {
+ $count++;
+ }
+ }
+
+ &App::sub_exit($count) if ($App::trace);
+ return($count);
+}
+
sub new_event_token {
&App::sub_entry if ($App::trace);
my ($self) = @_;