/[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 - (hide 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 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     # If you are locking for Graph, then you cannot lock for Global, but
9     # still you can lock for ID.
10 wakaba 1.1
11     use Fcntl ':flock';
12    
13     sub new ($) {
14     my $self = bless {
15     'file_name' => 'lock',
16 wakaba 1.2 lock_type => 'Global',
17 wakaba 1.1 }, shift;
18     return $self;
19     } # new
20    
21 wakaba 1.2 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 wakaba 1.1 sub lock ($) {
45     my $self = shift;
46 wakaba 1.2
47     $self->check_lockability;
48     $CurrentlyLocking->{$self->lock_type}++;
49     warn "@{[$self->lock_type]} $CurrentlyLocking->{$self->lock_type} $self->{file_name}";
50 wakaba 1.1
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 wakaba 1.2 my $self = shift;
58    
59     $CurrentlyLocking->{$self->lock_type}--;
60    
61     close $self->{lock};
62 wakaba 1.1 } # unlock
63    
64     sub DESTROY ($) {
65     $_[0]->unlock;
66     } # DESTROY
67    
68     1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24