#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use constant SQL_STEP_INTERVAL => 1;
use IO::Select;
use POSIX qw{mkfifo};
use PM_1133400_Shared qw{:SQL};
sub _handle_death_signal {
my $sig = shift;
remove_fifo();
die "\nSQL_SIM: Trapped and handled SIG$sig signal. Exiting.\n";
}
BEGIN {
my @death_signals = qw{INT HUP};
@SIG{@death_signals} = (\&_handle_death_signal) x @death_signals;
remove_fifo();
mkfifo FIFO, 0600;
}
END {
remove_fifo();
}
my @steps = @{get_steps()};
my $step = $#steps;
{
local $| = 1;
if (fork) {
open my $keep_alive_pipe_writer, '>', FIFO;
wait;
close $keep_alive_pipe_writer;
exit;
}
open my $pipe_reader, '<', FIFO;
my $select = IO::Select::->new();
$select->add($pipe_reader);
while (1) {
while ($select->can_read(0)) {
$step = <$pipe_reader>;
chomp $step;
print 'SQL_SIM: Executing web request: ';
$steps[$step]->();
}
print 'SQL_SIM: Executing normal step: ';
$step = ++$step % @steps;
$steps[$step]->();
sleep SQL_STEP_INTERVAL;
}
close $pipe_reader;
}
####
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use constant {
TESTS => 5,
WAIT_RAND => 3,
};
use PM_1133400_Shared qw{:WEB};
my $total_steps = get_total_steps();
my @queue;
{
local $| = 1;
for (1 .. TESTS) {
sleep int rand WAIT_RAND;
my $rand_step = int rand $total_steps;
if (-p FIFO) {
open my $pipe_writer, '>', FIFO;
if (@queue) {
for (@queue) {
print "WEB_SIM: FIFO Available! Piping from queue [$_]\n";
print $pipe_writer "$_\n";
}
@queue = ();
}
print "WEB_SIM: FIFO Available! Piping new step [$rand_step]\n";
print $pipe_writer "$rand_step\n";
close $pipe_writer;
}
else {
print "WEB_SIM: FIFO Unavailable! Queueing step [$rand_step].\n";
push @queue, $rand_step;
}
}
}
####
package PM_1133400_Shared;
use strict;
use warnings;
use autodie;
use constant FIFO => 'pm_1133400_fifo';
use Exporter qw{import};
our @EXPORT_OK = qw{FIFO get_steps get_total_steps remove_fifo};
our %EXPORT_TAGS = (
SQL => [qw{FIFO get_steps remove_fifo}],
WEB => [qw{FIFO get_total_steps}],
);
{
my @steps = (
sub { print "Step 0\n" },
sub { print "Step 1\n" },
sub { print "Step 2\n" },
sub { print "Step 3\n" },
sub { print "Step 4\n" },
sub { print "Step 5\n" },
sub { print "Step 6\n" },
sub { print "Step 7\n" },
sub { print "Step 8\n" },
sub {
print "Step 9\n";
remove_fifo();
print "Done!\n";
exit;
},
);
sub get_steps { [@steps] }
sub get_total_steps { scalar @steps }
}
sub remove_fifo { unlink FIFO if -e FIFO }
1;
####
pm_1133400_sim_sql.pl & pm_1133400_sim_web.pl
####
WEB_SIM: FIFO Unavailable! Queueing step [5].
SQL_SIM: Executing normal step: Step 0
SQL_SIM: Executing normal step: Step 1
WEB_SIM: FIFO Available! Piping from queue [5]
...
SQL_SIM: Executing web request: Step 5
####
SQL_SIM: Executing normal step: Step 0
SQL_SIM: Executing normal step: Step 1
WEB_SIM: FIFO Available! Piping new step [4]
SQL_SIM: Executing web request: Step 4
SQL_SIM: Executing normal step: Step 5
SQL_SIM: Executing normal step: Step 6
...