Author: spadkins Date: Mon Feb 11 14:07:20 2013 New Revision: 15572 Modified: p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm Log: In abort_async_event() mark an event as aborted. Have dispatch_pending_async_events() check for aborted events and remove from the pending_async_events array. 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 Feb 11 14:07:20 2013 @@ -526,29 +526,35 @@ while ($i <= $max_i && $events_occurred < $max_events) { $async_event = $pending_async_events->[$i]; $event = $async_event->[0]; - if ($event->{destination}) { - $self->send_async_event_now(@$async_event); - $events_occurred ++; + + if ($event->{aborted}) { splice(@$pending_async_events, $i, 1); # remove $pending_async_events->[$i] $max_i--; - } - elsif ($event_capacity_exists) { - $assigned = $self->assign_event_destination($event); - if ($assigned) { + } else { + if ($event->{destination}) { $self->send_async_event_now(@$async_event); $events_occurred ++; - # keep $i the same splice(@$pending_async_events, $i, 1); # remove $pending_async_events->[$i] $max_i--; } - else { # [undef] no servers are eligible for assignment - $event_capacity_exists = 0; # there's no sense looking at the other pending async events + elsif ($event_capacity_exists) { + $assigned = $self->assign_event_destination($event); + if ($assigned) { + $self->send_async_event_now(@$async_event); + $events_occurred ++; + # keep $i the same + splice(@$pending_async_events, $i, 1); # remove $pending_async_events->[$i] + $max_i--; + } + else { # [undef] no servers are eligible for assignment + $event_capacity_exists = 0; # there's no sense looking at the other pending async events + $i++; # look at the next one + } + } + else { # [0] this async_event is not eligible to run $i++; # look at the next one } } - else { # [0] this async_event is not eligible to run - $i++; # look at the next one - } } $self->log({level=>3},"dispatch_pending_async_events exit: events_occurred=[$events_occurred] time=[" . sprintf("%.4f", tv_interval($t0, [gettimeofday])) . "]\n") if $self->{poe_trace}; @@ -774,7 +780,7 @@ for (my $i = 0; $i <= $#$pending_async_events; $i++) { $async_event = $pending_async_events->[$i]; if ($async_event->[0]{event_token} eq $event_token) { - splice(@$pending_async_events, $i, 1); + $async_event->[0]{aborted} = 1; $aborted = 1; last; } @@ -1391,3 +1397,4 @@ 1; +