use Object::Remote::Logging qw( :log :dlog router );
use Moo;
-BEGIN { router()->exclude_forwarding }
+BEGIN {
+ $SIG{PIPE} = sub { log_debug { "Got a PIPE signal" } };
+
+ router()->exclude_forwarding
+}
# this is ro because we only actually set it using local in sub run
has is_running => (is => 'ro', clearer => 'stop');
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" };
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" };
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};
}