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

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24