# 3 IPC trips: FETCH, FETCH, STORE
$t{$name}->{r}++;
# 6 IPC trips: FETCH, FETCH, FETCH, FETCH, FETCH, STORE
$t{index}->{ $t{prev} }{ $t{cur} }++;
####
# 2 IPC trips: FETCH, STORE
$t{ "$name-rg" }++;
# 4 IPC trips: FETCH, FETCH, FETCH, STORE
my $prev = $t{prev};
my $cur = $t{cur};
$t{ "index-$prev-$cur" }++;
####
my $mutex = Mutex->new;
...
my $rg = sub {
my $name = shift || die;
print "(rg)" if ( $name eq "fork1" );
print "[rg]" if ( $name eq "fork2" );
$mutex->enter( sub {
$t{$name}->{r}++;
$t{$name}->{rg}++;
$t{$name}->{g}++;
$t{cur} = "rg";
$t{index}->{ $t{prev} }{ $t{cur} }++;
$t{prev} = "rg";
});
$sleep_inside->();
};
my $ry = sub {
my $name = shift || die;
print "(ry)" if ( $name eq "fork1" );
print "[ry]" if ( $name eq "fork2" );
$mutex->enter( sub {
$t{$name}->{r}++;
$t{$name}->{ry}++;
$t{$name}->{y}++;
$t{cur} = "ry";
$t{index}->{ $t{prev} }{ $t{cur} }++;
$t{prev} = "ry";
});
$sleep_inside->();
};
my $rgy = sub {
my $name = shift || die;
say "{rgy}" if ( $name eq "mothersbaugh" );
$mutex->enter( sub {
$t{$name}->{r}++;
$t{$name}->{rg}++;
$t{$name}->{g}++;
$t{$name}->{gy}++;
$t{$name}->{rgy}++;
$t{cur} = "rgy";
$t{index}->{ $t{prev} }{ $t{cur} }++;
$t{prev} = "rgy";
});
$sleep_inside->();
};
####
$ diff orig.pl script.pl
2a3,19
> package My::Hash;
>
> use MCE::Shared::Hash;
> use base 'MCE::Shared::Hash';
>
> sub pipeline_eval {
> my $self = shift;
> local $_ = $self;
> while ( @_ ) {
> eval shift->[0];
> }
> return;
> }
>
> 1;
>
> package main;
>
70c87
< tie my %t, 'MCE::Shared';
---
> tie my %t, 'MCE::Shared', { module => 'My::Hash' };
91,97c108,115
< $t{$name}->{r}++;
< $t{$name}->{rg}++;
< $t{$name}->{g}++;
<
< $t{cur} = "rg";
< $t{index}->{ $t{prev} }{ $t{cur} }++;
< $t{prev} = "rg";
---
> tied( %t )->pipeline_eval(
> [ "\$_->{ $name }->{r }++" ],
> [ "\$_->{ $name }->{rg}++" ],
> [ "\$_->{ $name }->{g }++" ],
> [ "\$_->{ cur } = 'rg'" ],
> [ "\$_->{ index }->{ \$_->{ prev } }{ \$_->{ cur } }++" ],
> [ "\$_->{ prev } = 'rg'" ]
> );
107,113c125,132
< $t{$name}->{r}++;
< $t{$name}->{ry}++;
< $t{$name}->{y}++;
<
< $t{cur} = "ry";
< $t{index}->{ $t{prev} }{ $t{cur} }++;
< $t{prev} = "ry";
---
> tied( %t )->pipeline_eval(
> [ "\$_->{ $name }->{r }++" ],
> [ "\$_->{ $name }->{ry}++" ],
> [ "\$_->{ $name }->{y }++" ],
> [ "\$_->{ cur } = 'ry'" ],
> [ "\$_->{ index }->{ \$_->{ prev } }{ \$_->{ cur } }++" ],
> [ "\$_->{ prev } = 'ry'" ]
> );
123,131c142,151
< $t{$name}->{r}++;
< $t{$name}->{rg}++;
< $t{$name}->{g}++;
< $t{$name}->{gy}++;
< $t{$name}->{rgy}++;
<
< $t{cur} = "rgy";
< $t{index}->{ $t{prev} }{ $t{cur} }++;
< $t{prev} = "rgy";
---
> tied( %t )->pipeline_eval(
> [ "\$_->{ $name }->{r }++" ],
> [ "\$_->{ $name }->{rg }++" ],
> [ "\$_->{ $name }->{g }++" ],
> [ "\$_->{ $name }->{gy }++" ],
> [ "\$_->{ $name }->{rgy}++" ],
> [ "\$_->{ cur } = 'rgy'" ],
> [ "\$_->{ index }->{ \$_->{ prev } }{ \$_->{ cur } }++" ],
> [ "\$_->{ prev } = 'rgy'" ]
> );
####
$VAR1 = {
'cur' => 'ry',
'index' => {
'ry' => {
'rg' => 4035,
'rgy' => 2471,
'ry' => 3493
},
'rgy' => {
'rg' => 2480,
'ry' => 2496,
'rgy' => 24
},
'rg' => {
'rg' => 3485,
'rgy' => 2504,
'ry' => 4011
},
'null' => {
'rgy' => 1
}
},
'starttime' => 1499832324,
'fork2' => {
'rg' => 5000,
'ry' => 5000,
'r' => 10000,
'g' => 5000,
'y' => 5000
},
'prev' => 'ry',
'mothersbaugh' => {
'rgy' => 5000,
'gy' => 5000,
'rg' => 5000,
'r' => 5000,
'g' => 5000
},
'fork1' => {
'r' => 10000,
'g' => 5000,
'y' => 5000,
'rg' => 5000,
'ry' => 5000
}
};
####
# print Dumper( tied(%t)->export( { unbless => 1 } ) ) if ($STATS);
my %h = %{ tied(%t)->export({ unbless => 1 }) }; untie %t;
print Dumper(\%h) if $STATS;