diff options
Diffstat (limited to 'lib/MCE/Mutex/Channel.pm')
-rw-r--r-- | lib/MCE/Mutex/Channel.pm | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/lib/MCE/Mutex/Channel.pm b/lib/MCE/Mutex/Channel.pm index 60d08c2..80fa9c5 100644 --- a/lib/MCE/Mutex/Channel.pm +++ b/lib/MCE/Mutex/Channel.pm @@ -11,7 +11,7 @@ use warnings; no warnings qw( threads recursion uninitialized once ); -our $VERSION = '1.888'; +our $VERSION = '1.889'; use if $^O eq 'MSWin32', 'threads'; use if $^O eq 'MSWin32', 'threads::shared'; @@ -29,9 +29,15 @@ sub CLONE { $tid = threads->tid if $INC{'threads.pm'}; } +sub MCE::Mutex::Channel::_guard::DESTROY { + my ($pid, $obj) = @{ $_[0] }; + CORE::syswrite($obj->{_w_sock}, '0'), $obj->{ $pid } = 0 if $obj->{ $pid }; + + return; +} + sub DESTROY { my ($pid, $obj) = ($tid ? $$ .'.'. $tid : $$, @_); - CORE::syswrite($obj->{_w_sock}, '0'), $obj->{$pid } = 0 if $obj->{$pid }; CORE::syswrite($obj->{_r_sock}, '0'), $obj->{$pid.'b'} = 0 if $obj->{$pid.'b'}; @@ -90,14 +96,20 @@ sub new { sub lock { my ($pid, $obj) = ($tid ? $$ .'.'. $tid : $$, shift); - CORE::lock($obj->{_t_lock}), MCE::Util::_sock_ready($obj->{_r_sock}) - if $is_MSWin32; - MCE::Util::_sysread($obj->{_r_sock}, my($b), 1), $obj->{ $pid } = 1 - unless $obj->{ $pid }; + unless ($obj->{ $pid }) { + CORE::lock($obj->{_t_lock}), MCE::Util::_sock_ready($obj->{_r_sock}) + if $is_MSWin32; + MCE::Util::_sysread($obj->{_r_sock}, my($b), 1), $obj->{ $pid } = 1; + } return; } +sub guard_lock { + &lock(@_); + bless([ $tid ? $$ .'.'. $tid : $$, $_[0] ], MCE::Mutex::Channel::_guard::); +} + *lock_exclusive = \&lock; *lock_shared = \&lock; @@ -117,17 +129,16 @@ sub synchronize { return unless ref($code) eq 'CODE'; # lock, run, unlock - inlined for performance - CORE::lock($obj->{_t_lock}), MCE::Util::_sock_ready($obj->{_r_sock}) - if $is_MSWin32; - MCE::Util::_sysread($obj->{_r_sock}, $b, 1), $obj->{ $pid } = 1 - unless $obj->{ $pid }; - + my $guard = bless([ $pid, $obj ], MCE::Mutex::Channel::_guard::); + unless ($obj->{ $pid }) { + CORE::lock($obj->{_t_lock}), MCE::Util::_sock_ready($obj->{_r_sock}) + if $is_MSWin32; + MCE::Util::_sysread($obj->{_r_sock}, $b, 1), $obj->{ $pid } = 1; + } (defined wantarray) ? @ret = wantarray ? $code->(@_) : scalar $code->(@_) : $code->(@_); - CORE::syswrite($obj->{_w_sock}, '0'), $obj->{ $pid } = 0; - return wantarray ? @ret : $ret[-1]; } @@ -176,7 +187,7 @@ MCE::Mutex::Channel - Mutex locking via a pipe or socket =head1 VERSION -This document describes MCE::Mutex::Channel version 1.888 +This document describes MCE::Mutex::Channel version 1.889 =head1 DESCRIPTION @@ -194,6 +205,8 @@ The API is described in L<MCE::Mutex>. =item lock_shared +=item guard_lock + =item unlock =item synchronize |