~bzr-pqm/bzr/bzr.dev

1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
1
# Copyright (C) 2005 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
1185.65.27 by Robert Collins
Tweak storage towards mergability.
18
__all__ = ['needs_read_lock',
19
           'needs_write_lock',
20
           ]
21
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
22
def needs_read_lock(unbound):
23
    """Decorate unbound to take out and release a read lock.
24
25
    This decorator can be applied to methods of any class with lock_read() and
26
    unlock() methods.
27
    
28
    Typical usage:
29
        
30
    class Branch(...):
31
        @needs_read_lock
32
        def branch_method(self, ...):
33
            stuff
34
    """
1534.4.48 by Robert Collins
Make needs_read_lock and needs_write_lock more visible in tracebacks
35
    def read_locked(self, *args, **kwargs):
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
36
        self.lock_read()
37
        try:
38
            return unbound(self, *args, **kwargs)
39
        finally:
40
            self.unlock()
1534.4.48 by Robert Collins
Make needs_read_lock and needs_write_lock more visible in tracebacks
41
    read_locked.__doc__ = unbound.__doc__
42
    read_locked.__name__ = unbound.__name__
43
    return read_locked
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
44
45
46
def needs_write_lock(unbound):
47
    """Decorate unbound to take out and release a write lock."""
1534.4.48 by Robert Collins
Make needs_read_lock and needs_write_lock more visible in tracebacks
48
    def write_locked(self, *args, **kwargs):
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
49
        self.lock_write()
50
        try:
51
            return unbound(self, *args, **kwargs)
52
        finally:
53
            self.unlock()
1534.4.48 by Robert Collins
Make needs_read_lock and needs_write_lock more visible in tracebacks
54
    write_locked.__doc__ = unbound.__doc__
55
    write_locked.__name__ = unbound.__name__
56
    return write_locked
1185.70.3 by Martin Pool
Various updates to make storage branch mergeable:
57