use strict; use warnings; package Ox::Lock; use vars '$VERSION'; $VERSION = '0.05'; use Fcntl ':flock'; sub new { my $proto = shift; return undef unless defined $proto; my $class = ref($proto) || $proto; my $self = bless {}, $class; $self->init(@_) if @_; $self->directory('/') unless defined $self->directory; return ($self); } sub DESTROY { shift->unlock; } sub directory { my $self = shift; return ($self->value_('directory', @_)); } sub handle { my $self = shift; return $self->directory().".lock"; } sub load { my $self = shift; $self->unload(); unless(-e $self->handle) { my $fh; if(open my $fh, ">", $self->handle) { $self->{-lock} = $fh; return (1); } } return (0); } sub unload { my $self = shift; if(defined $self->{-lock}) { close $self->{-lock}; unlink $self->handle; $self->{-lock} = undef; } } sub lock { my $self = shift; if($self->load) { return (flock $self->{-lock}, LOCK_EX); } else { return (0); } } sub trylock { my $self = shift; if($self->load) { return (flock $self->{-lock}, LOCK_EX | LOCK_NB); } else { return (0); } } sub unlock { shift->unload; } sub init(\%) { my ($self, %args) = @_; exists $args{$_} && ($self->value_($_, delete $args{$_})) foreach (qw/directory/); } sub value_ { my ($self, $field, $value) = @_; return (undef) unless defined $field; if(defined $value) { $self->{'OWML_'.lc($field)} = $value; } return ($self->{'OWML_'.lc($field)}); } 1;