Model queued Perl work as deterministic scalar steps.

work queue A queue can be replayed without timers when each work item is represented by fixed scalar data.

Work Queue Panel

extra
work_queue_panel.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;

my $extra = "audit";
my @names = ("read", $extra, "write");
my $log = "";
my $total = 0;

for my $index (0 .. $#names) {
    my $name = $names[$index];
    my $cost = $index + 1;
    my $label = "run:" . $name;
    $total = $total + $cost;

    if ($log eq "") {
        $log = $label;
    } else {
        $log = $log . "," . $label;
    }
}

print "extra=$extra\n";
print "log=$log\n";
print "total=$total\n";
use strict;
use warnings;

my $extra = "read";
my @names = ("read", $extra, "write");
my $log = "";
my $total = 0;

for my $index (0 .. $#names) {
    my $name = $names[$index];
    my $cost = $index + 1;
    my $label = "run:" . $name;
    $total = $total + $cost;

    if ($log eq "") {
        $log = $label;
    } else {
        $log = $log . "," . $label;
    }
}

print "extra=$extra\n";
print "log=$log\n";
print "total=$total\n";
use strict;
use warnings;

my $extra = "render";
my @names = ("read", $extra, "write");
my $log = "";
my $total = 0;

for my $index (0 .. $#names) {
    my $name = $names[$index];
    my $cost = $index + 1;
    my $label = "run:" . $name;
    $total = $total + $cost;

    if ($log eq "") {
        $log = $label;
    } else {
        $log = $log . "," . $label;
    }
}

print "extra=$extra\n";
print "log=$log\n";
print "total=$total\n";
  1. $extra ← audit, @names ← 3, $log ← (empty), $total ← 0

    4my $extra→ audit = "audit"; #@extra="read", "render"5my @names→ 3 = ("read", $extraaudit, "write");6my $log→ (empty) = "";7my $total→ 0 = 0;
  2. $name ← read, $cost ← 1, $label ← run:read, $total ← 1

    pass 1 of 3
    9for my $index0 (0 .. $#names) {10    my $name→ read = $names[$index]read;11    my $cost→ 1 = $index0 + 1;12    my $label→ run:read = "run:" . $nameread;13    $total→ 1 = $total + $cost1;
    All 3 passes — pass 1 is the card above
    pass$index$names[$index]$name$cost$label$total$log
    10readread1run:read0 1(empty) run:read
    21auditaudit2run:audit1 3run:read run:read,run:audit
    32writewrite3run:write3 6run:read,run:audit run:read,run:audit,run:write
  3. $log ← run:read

    15if ($log(empty) eq "") {16    $log→ run:read = $labelrun:read;17} else {
  4. $log ← run:read,run:audit

    pass 1 of 2
    16    $log = $label;17} else {18    $log→ run:read,run:audit = $log . "," . $labelrun:audit;19}
  5. $log ← run:read,run:audit,run:write

    pass 2 of 2
    16    $log = $label;17} else {18    $log→ run:read,run:audit,run:write = $log . "," . $labelrun:write;19}
  6. print "extra=$extra ";

    22print "extra=$extraaudit\n";23print "log=$logrun:read,run:audit,run:write\n";24print "total=$total6\n";
    outputextra=audit
    log=run:read,run:audit,run:write
    total=6
  1. $extra ← read, @names ← 3, $log ← (empty), $total ← 0

    4my $extra→ read = "read";5my @names→ 3 = ("read", $extraread, "write");6my $log→ (empty) = "";7my $total→ 0 = 0;
  2. $name ← read, $cost ← 1, $label ← run:read, $total ← 1

    pass 1 of 3
    9for my $index0 (0 .. $#names) {10    my $name→ read = $names[$index]read;11    my $cost→ 1 = $index0 + 1;12    my $label→ run:read = "run:" . $nameread;13    $total→ 1 = $total + $cost1;
    All 3 passes — pass 1 is the card above
    pass$index$names[$index]$name$cost$label$total$log
    10readread1run:read0 1(empty) run:read
    21readread2run:read1 3run:read run:read,run:read
    32writewrite3run:write3 6run:read,run:read run:read,run:read,run:write
  3. $log ← run:read

    15if ($log(empty) eq "") {16    $log→ run:read = $labelrun:read;17} else {
  4. $log ← run:read,run:read

    pass 1 of 2
    16    $log = $label;17} else {18    $log→ run:read,run:read = $log . "," . $labelrun:read;19}
  5. $log ← run:read,run:read,run:write

    pass 2 of 2
    16    $log = $label;17} else {18    $log→ run:read,run:read,run:write = $log . "," . $labelrun:write;19}
  6. print "extra=$extra ";

    22print "extra=$extraread\n";23print "log=$logrun:read,run:read,run:write\n";24print "total=$total6\n";
    outputextra=read
    log=run:read,run:read,run:write
    total=6
  1. $extra ← render, @names ← 3, $log ← (empty), $total ← 0

    4my $extra→ render = "render";5my @names→ 3 = ("read", $extrarender, "write");6my $log→ (empty) = "";7my $total→ 0 = 0;
  2. $name ← read, $cost ← 1, $label ← run:read, $total ← 1

    pass 1 of 3
    9for my $index0 (0 .. $#names) {10    my $name→ read = $names[$index]read;11    my $cost→ 1 = $index0 + 1;12    my $label→ run:read = "run:" . $nameread;13    $total→ 1 = $total + $cost1;
    All 3 passes — pass 1 is the card above
    pass$index$names[$index]$name$cost$label$total$log
    10readread1run:read0 1(empty) run:read
    21renderrender2run:render1 3run:read run:read,run:render
    32writewrite3run:write3 6run:read,run:render run:read,run:render,run:write
  3. $log ← run:read

    15if ($log(empty) eq "") {16    $log→ run:read = $labelrun:read;17} else {
  4. $log ← run:read,run:render

    pass 1 of 2
    16    $log = $label;17} else {18    $log→ run:read,run:render = $log . "," . $labelrun:render;19}
  5. $log ← run:read,run:render,run:write

    pass 2 of 2
    16    $log = $label;17} else {18    $log→ run:read,run:render,run:write = $log . "," . $labelrun:write;19}
  6. print "extra=$extra ";

    22print "extra=$extrarender\n";23print "log=$logrun:read,run:render,run:write\n";24print "total=$total6\n";
    outputextra=render
    log=run:read,run:render,run:write
    total=6