Mutex
view release on metacpan or search on metacpan
lib/Mutex/Channel.pm view on Meta::CPAN
###############################################################################
## ----------------------------------------------------------------------------
## Mutex::Channel - Mutex locking via a pipe or socket.
##
###############################################################################
package Mutex::Channel;
use strict;
use warnings;
no warnings qw( threads recursion uninitialized once );
our $VERSION = '1.011';
use if $^O eq 'MSWin32', 'threads';
use if $^O eq 'MSWin32', 'threads::shared';
use base 'Mutex';
use Mutex::Util;
use Scalar::Util 'looks_like_number';
use Time::HiRes 'alarm';
my $is_MSWin32 = ($^O eq 'MSWin32') ? 1 : 0;
my $use_pipe = ($^O !~ /mswin|mingw|msys|cygwin/i && $] gt '5.010000');
my $tid = $INC{'threads.pm'} ? threads->tid : 0;
sub CLONE {
$tid = threads->tid if $INC{'threads.pm'};
}
sub 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 };
if ( $obj->{_init_pid} eq $pid ) {
$use_pipe
? Mutex::Util::destroy_pipes($obj, qw(_w_sock _r_sock))
: Mutex::Util::destroy_socks($obj, qw(_w_sock _r_sock));
}
return;
}
###############################################################################
## ----------------------------------------------------------------------------
## Public methods.
##
###############################################################################
sub new {
my ($class, %obj) = (@_, impl => 'Channel');
$obj{_init_pid} = $tid ? $$ .'.'. $tid : $$;
$obj{_t_lock} = threads::shared::share( my $t_lock ) if $is_MSWin32;
$use_pipe
? Mutex::Util::pipe_pair(\%obj, qw(_r_sock _w_sock))
: Mutex::Util::sock_pair(\%obj, qw(_r_sock _w_sock));
CORE::syswrite($obj{_w_sock}, '0');
return bless(\%obj, $class);
}
sub lock {
my ($pid, $obj) = ($tid ? $$ .'.'. $tid : $$, shift);
unless ($obj->{ $pid }) {
CORE::lock($obj->{_t_lock}), Mutex::Util::_sock_ready($obj->{_r_sock})
if $is_MSWin32;
Mutex::Util::_sysread($obj->{_r_sock}, my($b), 1), $obj->{ $pid } = 1;
}
return;
}
sub guard_lock {
&lock(@_);
( run in 1.368 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )