IPC-SRLock
view release on metacpan or search on metacpan
lib/IPC/SRLock.pm view on Meta::CPAN
around 'BUILDARGS' => sub {
my ($orig, $self, @args) = @_; my $attr = $orig->( $self, @args );
my $builder = $attr->{builder};
my $conf = $builder && $builder->can( 'config' ) ? $builder->config : 0;
$conf and $conf->can( 'lock_attributes' )
and merge_attributes $attr, $conf->lock_attributes,
[ keys %{ $conf->lock_attributes } ];
$attr->{name} //= lc join '_', split m{ :: }mx, __PACKAGE__, -1;
my $type = delete $attr->{type}; $attr = { _implementation_attr => $attr };
$type and $type !~ m{ \A ([a-zA-Z0-9\:\+]+) \z }mx
and die "Type ${type} tainted";
$type and $attr->{type} = $1;
return $attr;
};
lib/IPC/SRLock/Memcached.pm view on Meta::CPAN
my $_list = sub {
my $self = shift;
$self->memd->add( $self->lockfile, 1, $self->patience + 30 ) or return 0;
my $shm_content = $self->memd->get( $self->shmfile ) // {};
my $list = []; $self->$_unlock_share;
for my $key (sort keys %{ $shm_content }) {
my @fields = split m{ , }mx, $shm_content->{ $key };
push @{ $list }, { key => $key,
pid => $fields[ 0 ],
stime => $fields[ 1 ],
timeout => $fields[ 2 ] };
}
return $list;
};
my $_reset = sub {
my ($self, $args, $now) = @_; my $key = $args->{k}; my $pid = $args->{p};
$self->memd->add( $self->lockfile, 1, $self->patience + 30 ) or return 0;
my $shm_content = $self->memd->get( $self->shmfile ) // {};
my $lock; exists $shm_content->{ $key }
and $lock = $shm_content->{ $key }
and (split m{ , }mx, $lock)[ 0 ] != $pid
and $self->$_unlock_share
and throw 'Lock [_1] set by another process', [ $key ];
not delete $shm_content->{ $key } and $self->$_unlock_share
and throw 'Lock [_1] not set', [ $key ];
$self->memd->set( $self->shmfile, $shm_content ); $self->$_unlock_share;
return 1;
};
my $_set = sub {
my ($self, $args, $now) = @_;
my $key = $args->{k}; my $pid = $args->{p}; my $timeout = $args->{t};
$self->memd->add( $self->lockfile, 1, $self->patience + 30 ) or return 0;
my $shm_content = $self->memd->get( $self->shmfile ) // {}; my $lock;
if ($lock = $shm_content->{ $key }) {
my @fields = split m{ , }mx, $lock;
$fields[ 2 ] and $now > $fields[ 1 ] + $fields[ 2 ]
and $lock = $self->$_expire_lock( $shm_content, $key, @fields );
}
$lock and $self->$_unlock_share and return 0;
$shm_content->{ $key } = "${pid},${now},${timeout}";
$self->memd->set( $self->shmfile, $shm_content ); $self->$_unlock_share;
$self->log->debug( "Lock ${key} set by ${pid}" );
( run in 1.818 second using v1.01-cache-2.11-cpan-71847e10f99 )