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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations) (download)
Sun Jul 12 10:57:24 2009 UTC (15 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.3: +4 -2 lines
++ swe/lib/suikawiki/ChangeLog	12 Jul 2009 10:57:18 -0000
	* main.pl: Implemented new-document case of posturl method.

2009-07-12  Wakaba  <wakaba@suika.fam.cx>

1 wakaba 1.1 package SWE::DB::Lock;
2     use strict;
3 wakaba 1.2
4     my $CurrentlyLocking = {};
5     my $LockTypes = [qw/
6     ID Name Index IDs Names Graph Weight Global
7     /];
8 wakaba 1.4 ## 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 wakaba 1.1
13     use Fcntl ':flock';
14    
15     sub new ($) {
16     my $self = bless {
17     'file_name' => 'lock',
18 wakaba 1.2 lock_type => 'Global',
19 wakaba 1.1 }, shift;
20     return $self;
21     } # new
22    
23 wakaba 1.2 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 wakaba 1.1 sub lock ($) {
47     my $self = shift;
48 wakaba 1.2
49     $self->check_lockability;
50     $CurrentlyLocking->{$self->lock_type}++;
51     warn "@{[$self->lock_type]} $CurrentlyLocking->{$self->lock_type} $self->{file_name}";
52 wakaba 1.1
53     open my $file, '>', $self->{file_name} or die "$0: $self->{file_name}: $!";
54     flock $file, LOCK_EX;
55     $self->{lock} = $file;
56     } # lock
57    
58     sub unlock ($) {
59 wakaba 1.2 my $self = shift;
60    
61     $CurrentlyLocking->{$self->lock_type}--;
62    
63     close $self->{lock};
64 wakaba 1.1 } # unlock
65    
66     sub DESTROY ($) {
67     $_[0]->unlock;
68     } # DESTROY
69    
70     1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24