/[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.3 - (show annotations) (download)
Sun Jul 12 07:06:53 2009 UTC (15 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.2: +0 -1 lines
++ swe/lib/suikawiki/ChangeLog	12 Jul 2009 07:06:43 -0000
	* main.pl: Update tfidf data when a page content is updated.

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 use Fcntl ':flock';
12
13 sub new ($) {
14 my $self = bless {
15 'file_name' => 'lock',
16 lock_type => 'Global',
17 }, shift;
18 return $self;
19 } # new
20
21 sub lock_type ($;$) {
22 my $self = shift;
23 if (@_) {
24 $self->{lock_type} = shift;
25 }
26 return $self->{lock_type};
27 } # lock_type
28
29 sub check_lockability ($) {
30 my $self = shift;
31
32 my $self_lt = $self->lock_type;
33 for my $lt (@$LockTypes) {
34 if ($self_lt eq $lt) {
35 last;
36 } elsif ($CurrentlyLocking->{$lt}) {
37 die qq[$0: It is currently locking for "$lt" so that it cannot be locked for the "$self_lt"];
38 }
39 }
40
41 return 1;
42 } # check_lockability
43
44 sub lock ($) {
45 my $self = shift;
46
47 $self->check_lockability;
48 $CurrentlyLocking->{$self->lock_type}++;
49 warn "@{[$self->lock_type]} $CurrentlyLocking->{$self->lock_type} $self->{file_name}";
50
51 open my $file, '>', $self->{file_name} or die "$0: $self->{file_name}: $!";
52 flock $file, LOCK_EX;
53 $self->{lock} = $file;
54 } # lock
55
56 sub unlock ($) {
57 my $self = shift;
58
59 $CurrentlyLocking->{$self->lock_type}--;
60
61 close $self->{lock};
62 } # unlock
63
64 sub DESTROY ($) {
65 $_[0]->unlock;
66 } # DESTROY
67
68 1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24