Store independent task results in scalar slots before summarizing them.

task slots Separate result slots make replay easier to follow because each task updates its own scalar state.

Task Result Slots

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

sub read_slot {
    my ($value) = @_;
    return $value + 10;
}

sub write_slot {
    my ($value) = @_;
    return $value * 3;
}

my $seed = 5;
my $read_value = 0;
my $write_value = 0;

$read_value = read_slot($seed);
$write_value = write_slot($seed);
my $total = $read_value + $write_value;

print "read=$read_value\n";
print "write=$write_value\n";
print "total=$total\n";
use strict;
use warnings;

sub read_slot {
    my ($value) = @_;
    return $value + 10;
}

sub write_slot {
    my ($value) = @_;
    return $value * 3;
}

my $seed = 2;
my $read_value = 0;
my $write_value = 0;

$read_value = read_slot($seed);
$write_value = write_slot($seed);
my $total = $read_value + $write_value;

print "read=$read_value\n";
print "write=$write_value\n";
print "total=$total\n";
use strict;
use warnings;

sub read_slot {
    my ($value) = @_;
    return $value + 10;
}

sub write_slot {
    my ($value) = @_;
    return $value * 3;
}

my $seed = 8;
my $read_value = 0;
my $write_value = 0;

$read_value = read_slot($seed);
$write_value = write_slot($seed);
my $total = $read_value + $write_value;

print "read=$read_value\n";
print "write=$write_value\n";
print "total=$total\n";
  1. $seed ← 5, $read_value ← 0, $write_value ← 0

    14my $seed→ 5 = 5; #@seed=2, 815my $read_value→ 0 = 0;16my $write_value→ 0 = 0;1718$read_value0 = read_slot($seed5);19$write_value = write_slot($seed);
  2. $value ← 5

    4sub read_slot {5    my ($value→ 5) = @_;6    return $value5 + 10;7}
  3. $read_value ← 15

    18$read_value→ 15 = read_slot($seed5);19$write_value0 = write_slot($seed5);20my $total = $read_value + $write_value;
  4. $value ← 5

    9sub write_slot {10    my ($value→ 5) = @_;11    return $value5 * 3;12}
  5. $write_value ← 15, $total ← 30

    18$read_value = read_slot($seed);19$write_value→ 15 = write_slot($seed5);20my $total→ 30 = $read_value15 + $write_value15;2122print "read=$read_value15\n";23print "write=$write_value15\n";24print "total=$total30\n";
    outputread=15
    write=15
    total=30
  1. $seed ← 2, $read_value ← 0, $write_value ← 0

    14my $seed→ 2 = 2;15my $read_value→ 0 = 0;16my $write_value→ 0 = 0;1718$read_value0 = read_slot($seed2);19$write_value = write_slot($seed);
  2. $value ← 2

    4sub read_slot {5    my ($value→ 2) = @_;6    return $value2 + 10;7}
  3. $read_value ← 12

    18$read_value→ 12 = read_slot($seed2);19$write_value0 = write_slot($seed2);20my $total = $read_value + $write_value;
  4. $value ← 2

    9sub write_slot {10    my ($value→ 2) = @_;11    return $value2 * 3;12}
  5. $write_value ← 6, $total ← 18

    18$read_value = read_slot($seed);19$write_value→ 6 = write_slot($seed2);20my $total→ 18 = $read_value12 + $write_value6;2122print "read=$read_value12\n";23print "write=$write_value6\n";24print "total=$total18\n";
    outputread=12
    write=6
    total=18
  1. $seed ← 8, $read_value ← 0, $write_value ← 0

    14my $seed→ 8 = 8;15my $read_value→ 0 = 0;16my $write_value→ 0 = 0;1718$read_value0 = read_slot($seed8);19$write_value = write_slot($seed);
  2. $value ← 8

    4sub read_slot {5    my ($value→ 8) = @_;6    return $value8 + 10;7}
  3. $read_value ← 18

    18$read_value→ 18 = read_slot($seed8);19$write_value0 = write_slot($seed8);20my $total = $read_value + $write_value;
  4. $value ← 8

    9sub write_slot {10    my ($value→ 8) = @_;11    return $value8 * 3;12}
  5. $write_value ← 24, $total ← 42

    18$read_value = read_slot($seed);19$write_value→ 24 = write_slot($seed8);20my $total→ 42 = $read_value18 + $write_value24;2122print "read=$read_value18\n";23print "write=$write_value24\n";24print "total=$total42\n";
    outputread=18
    write=24
    total=42