... ##### MAIN TIMING LOOP ##### sub run($self) { my $runok = 0; eval { # Let STDOUT/STDERR settle down first sleep(0.1); my $nextCycleTime = $self->{config}->{mincycletime} + time; while(1) { my $workCount = $self->{worker}->run(); my $now = time; if($now < $nextCycleTime) { my $sleeptime = $nextCycleTime - $now; #print "** Fast cycle ($sleeptime sec to spare), sleeping **\n"; sleep($sleeptime); $nextCycleTime += $self->{config}->{mincycletime}; #print "** Wake-up call **\n"; } else { #print "** Slow cycle **\n"; $nextCycleTime = $self->{config}->{mincycletime} + $now; } } $runok = 1; }; if(!$runok) { suicide('RUN FAILED', $EVAL_ERROR); } return; } ... #### WORKER CYCLE #### sub run($self) { my $workCount = 0; # Run cleanup functions in case the last cycle bailed out with croak foreach my $worker (@{$self->{cleanup}}) { my $module = $worker->{Module}; my $funcname = $worker->{Function} ; #$workCount += $module->$funcname(); $module->$funcname(); } # Notify all registered workers about dead children while((my $child = shift @deadchildren)) { foreach my $worker (@{$self->{sigchld}}) { my $module = $worker->{Module}; my $funcname = $worker->{Function} ; $workCount++; $module->$funcname($child); } } # Run all worker functions foreach my $worker (@{$self->{workers}}) { my $module = $worker->{Module}; my $funcname = $worker->{Function} ; $workCount += $module->$funcname(); } # Run cleanup functions foreach my $worker (@{$self->{cleanup}}) { my $module = $worker->{Module}; my $funcname = $worker->{Function} ; #$workCount += $module->$funcname(); $module->$funcname(); } return $workCount; } ...