return $delay_max unless @$timers;
my $duration = $timers->[0]->[0] - time;
- log_trace { "next timer fires in '$duration' seconds " };
+ log_trace { "next timer fires in '$duration' seconds" };
if ($duration < 0) {
$duration = 0;
my ($self) = @_;
my $read = $self->_read_watches;
my $write = $self->_write_watches;
- our $Loop_Entered = 1;
my $read_count = 0;
my $write_count = 0;
my @c = caller;
my $wait_time = $self->_next_timer_expires_delay;
- log_trace { sprintf("Run loop: loop_once() has been invoked by $c[1]:$c[2] with read:%i write:%i select timeout:%s",
- scalar(keys(%$read)), scalar(keys(%$write)), defined $wait_time ? $wait_time : 'indefinite' ) };
+ log_trace {
+ sprintf("Run loop: loop_once() has been invoked by $c[1]:$c[2] with read:%i write:%i select timeout:%s",
+ scalar(keys(%$read)), scalar(keys(%$write)), defined $wait_time ? $wait_time : 'indefinite' )
+ };
my ($readable, $writeable) = IO::Select->select(
$self->_read_select, $self->_write_select, undef, $wait_time
);
# differentiate between an error and a timeout.
# -- no, love, mst.
- local $Loop_Entered;
-
- log_trace { "Reading from all ready filehandles" };
+ log_trace { "Reading from ready filehandles" };
foreach my $fh (@$readable) {
next unless $read->{$fh};
$read_count++;
$read->{$fh}();
- last if $Loop_Entered;
+ #FIXME this is a rough workaround for race conditions that can cause deadlocks
+ #under load
+ last;
}
- log_trace { "Writing to all ready filehandles" };
+ log_trace { "Writing to ready filehandles" };
foreach my $fh (@$writeable) {
next unless $write->{$fh};
$write_count++;
$write->{$fh}();
- last if $Loop_Entered;
+ #FIXME this is a rough workaround for race conditions that can cause deadlocks
+ #under load
+ last;
}
+ #moving the timers above the read() section exposes a deadlock
log_trace { "Read from $read_count filehandles; wrote to $write_count filehandles" };
my $timers = $self->_timers;
my $now = time();
if (defined($active->[2])) {
#handle the case of an 'every' timer
- $active->[0] = time() + $active->[2];
+ $active->[0] = time() + $active->[2];
Dlog_trace { "scheduling timer for repeat execution at $_"} $active->[0];
$self->_sort_timers;
} else {
#it doesn't repeat again so get rid of it
- shift(@$timers);
+ shift(@$timers);
}
#execute the timer
$active->[1]->();
-
- last if $Loop_Entered;
}
log_trace { "Run loop: single loop is completed" };
sub want_run {
my ($self) = @_;
- Dlog_debug { "Run loop: Incrimenting want_running, is now $_" }
+ Dlog_debug { "Run loop: Incremeting want_running, is now $_" }
++$self->{want_running};
}