/[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.2 - (hide annotations) (download)
Sun Jul 12 04:00:24 2009 UTC (15 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.1: +41 -1 lines
++ swe/lib/SWE/DB/ChangeLog	12 Jul 2009 03:59:58 -0000
2009-07-12  Wakaba  <wakaba@suika.fam.cx>

	* NamedText.pm (_get_file_name): Typo.

	* Lock.pm: Check whether any preferable locks are already taken or
	not to avoid deadlocks.

	* IDGenerator.pm (get_next_id): Set lock_type to enable lock order
	control.

	* IDLocks.pm (get_lock): Set lock_type to enable lock order
	control.

++ swe/lib/suikawiki/ChangeLog	12 Jul 2009 04:00:17 -0000
2009-07-12  Wakaba  <wakaba@suika.fam.cx>

	* main.pl: Set |lock_type| to enable lock order control.

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24