diff options
author | gregor herrmann <gregoa@debian.org> | 2023-09-30 00:00:19 +0200 |
---|---|---|
committer | gregor herrmann <gregoa@debian.org> | 2023-09-30 00:00:19 +0200 |
commit | 8e8880d453cb4f914b7392e307d67e1a6079d74a (patch) | |
tree | 21b16d1b2e5f93ecd1e3a0846b3c84c821c67eb6 /lib/MCE/Mutex/Channel2.pm | |
parent | 0b9a7cf58a1ca3b161dc4636a8f956b7ee21b300 (diff) |
New upstream version 1.889
Diffstat (limited to 'lib/MCE/Mutex/Channel2.pm')
-rw-r--r-- | lib/MCE/Mutex/Channel2.pm | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/lib/MCE/Mutex/Channel2.pm b/lib/MCE/Mutex/Channel2.pm index 9d071ef..f72fe0c 100644 --- a/lib/MCE/Mutex/Channel2.pm +++ b/lib/MCE/Mutex/Channel2.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'; @@ -28,6 +28,13 @@ sub CLONE { $tid = threads->tid() if $INC{'threads.pm'}; } +sub MCE::Mutex::Channel2::_guard::DESTROY { + my ($pid, $obj) = @{ $_[0] }; + CORE::syswrite($obj->{_r_sock}, '0'), $obj->{$pid.'b'} = 0 if $obj->{$pid.'b'}; + + return; +} + ############################################################################### ## ---------------------------------------------------------------------------- ## Public methods. @@ -56,14 +63,20 @@ sub new { sub lock2 { my ($pid, $obj) = ($tid ? $$ .'.'. $tid : $$, shift); - CORE::lock($obj->{_t_lock2}), MCE::Util::_sock_ready($obj->{_w_sock}) - if $is_MSWin32; - MCE::Util::_sysread($obj->{_w_sock}, my($b), 1), $obj->{ $pid.'b' } = 1 - unless $obj->{ $pid.'b' }; + unless ($obj->{ $pid.'b' }) { + CORE::lock($obj->{_t_lock2}), MCE::Util::_sock_ready($obj->{_w_sock}) + if $is_MSWin32; + MCE::Util::_sysread($obj->{_w_sock}, my($b), 1), $obj->{ $pid.'b' } = 1; + } return; } +sub guard_lock2 { + &lock2(@_); + bless([ $tid ? $$ .'.'. $tid : $$, $_[0] ], MCE::Mutex::Channel2::_guard::); +} + *lock_exclusive2 = \&lock2; *lock_shared2 = \&lock2; @@ -83,17 +96,16 @@ sub synchronize2 { return unless ref($code) eq 'CODE'; # lock, run, unlock - inlined for performance - CORE::lock($obj->{_t_lock2}), MCE::Util::_sock_ready($obj->{_w_sock}) - if $is_MSWin32; - MCE::Util::_sysread($obj->{_w_sock}, $b, 1), $obj->{ $pid.'b' } = 1 - unless $obj->{ $pid.'b' }; - + my $guard = bless([ $pid, $obj ], MCE::Mutex::Channel2::_guard::); + unless ($obj->{ $pid.'b' }) { + CORE::lock($obj->{_t_lock2}), MCE::Util::_sock_ready($obj->{_w_sock}) + if $is_MSWin32; + MCE::Util::_sysread($obj->{_w_sock}, $b, 1), $obj->{ $pid.'b' } = 1; + } (defined wantarray) ? @ret = wantarray ? $code->(@_) : scalar $code->(@_) : $code->(@_); - CORE::syswrite($obj->{_r_sock}, '0'), $obj->{ $pid.'b' } = 0; - return wantarray ? @ret : $ret[-1]; } @@ -142,7 +154,7 @@ MCE::Mutex::Channel2 - Provides two mutexes using a single channel =head1 VERSION -This document describes MCE::Mutex::Channel2 version 1.888 +This document describes MCE::Mutex::Channel2 version 1.889 =head1 DESCRIPTION @@ -171,6 +183,8 @@ The API is described in L<MCE::Mutex>. =item lock_shared +=item guard_lock + =item unlock =item synchronize @@ -191,6 +205,8 @@ The API is described in L<MCE::Mutex>. =item lock_shared2 +=item guard_lock2 + =item unlock2 =item synchronize2 |