summaryrefslogtreecommitdiff
path: root/lib/MCE/Mutex/Channel.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MCE/Mutex/Channel.pm')
-rw-r--r--lib/MCE/Mutex/Channel.pm41
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