/[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 - (show 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 package SWE::DB::Lock;
2 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';
14
15 sub new ($) {
16 my $self = bless {
17 'file_name' => 'lock',
18 lock_type => 'Global',
19 }, shift;
20 return $self;
21 } # 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 ($) {
47 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}: $!";
54 flock $file, LOCK_EX;
55 $self->{lock} = $file;
56 } # lock
57
58 sub unlock ($) {
59 my $self = shift;
60
61 $CurrentlyLocking->{$self->lock_type}--;
62
63 close $self->{lock};
64 } # unlock
65
66 sub DESTROY ($) {
67 $_[0]->unlock;
68 } # DESTROY
69
70 1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24