/[suikacvs]/webroot/swe/lib/SWE/DB/Lock.pm
Suika

Diff of /webroot/swe/lib/SWE/DB/Lock.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by wakaba, Sun Nov 9 06:46:47 2008 UTC revision 1.2 by wakaba, Sun Jul 12 04:00:24 2009 UTC
# Line 1  Line 1 
1  package SWE::DB::Lock;  package SWE::DB::Lock;
2  use strict;  use strict;
3    use warnings;
4    
5    my $CurrentlyLocking = {};
6    my $LockTypes = [qw/
7      ID Name Index IDs Names Graph Weight Global
8    /];
9      # If you are locking for Graph, then you cannot lock for Global, but
10      # still you can lock for ID.
11    
12  use Fcntl ':flock';  use Fcntl ':flock';
13    
14  sub new ($) {  sub new ($) {
15    my $self = bless {    my $self = bless {
16      'file_name' => 'lock',      'file_name' => 'lock',
17        lock_type => 'Global',
18    }, shift;    }, shift;
19    return $self;    return $self;
20  } # new  } # new
21    
22    sub lock_type ($;$) {
23      my $self = shift;
24      if (@_) {
25        $self->{lock_type} = shift;
26      }
27      return $self->{lock_type};
28    } # lock_type
29    
30    sub check_lockability ($) {
31      my $self = shift;
32      
33      my $self_lt = $self->lock_type;
34      for my $lt (@$LockTypes) {
35        if ($self_lt eq $lt) {
36          last;
37        } elsif ($CurrentlyLocking->{$lt}) {
38          die qq[$0: It is currently locking for "$lt" so that it cannot be locked for the "$self_lt"];
39        }
40      }
41    
42      return 1;
43    } # check_lockability
44                          
45  sub lock ($) {  sub lock ($) {
46    my $self = shift;    my $self = shift;
47    
48      $self->check_lockability;
49      $CurrentlyLocking->{$self->lock_type}++;
50    warn "@{[$self->lock_type]} $CurrentlyLocking->{$self->lock_type} $self->{file_name}";
51        
52    open my $file, '>', $self->{file_name} or die "$0: $self->{file_name}: $!";    open my $file, '>', $self->{file_name} or die "$0: $self->{file_name}: $!";
53    flock $file, LOCK_EX;    flock $file, LOCK_EX;
# Line 19  sub lock ($) { Line 55  sub lock ($) {
55  } # lock  } # lock
56    
57  sub unlock ($) {  sub unlock ($) {
58    close $_[0]->{lock};    my $self = shift;
59    
60      $CurrentlyLocking->{$self->lock_type}--;
61    
62      close $self->{lock};
63  } # unlock  } # unlock
64    
65  sub DESTROY ($) {  sub DESTROY ($) {

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24