[Pkg-bazaar-commits] ./bzr/unstable r578: - start to move toward Branch.lock and unlock methods,

Martin Pool mbp at sourcefrog.net
Fri Apr 10 08:19:42 UTC 2009


------------------------------------------------------------
revno: 578
committer: Martin Pool <mbp at sourcefrog.net>
timestamp: Fri 2005-05-27 15:23:57 +1000
message:
  - start to move toward Branch.lock and unlock methods, 
    rather than setting it in the constructor
modified:
  bzrlib/branch.py
-------------- next part --------------
=== modified file 'bzrlib/branch.py'
--- a/bzrlib/branch.py	2005-05-27 05:10:23 +0000
+++ b/bzrlib/branch.py	2005-05-27 05:23:57 +0000
@@ -32,8 +32,6 @@
 from errors import BzrError
 from textui import show_status
 
-import lock
-
 BZR_BRANCH_FORMAT = "Bazaar-NG branch, format 0.0.4\n"
 ## TODO: Maybe include checks for common corruption of newlines, etc?
 
@@ -87,9 +85,16 @@
 
     base
         Base directory of the branch.
+
+    _lock_mode
+        None, or a duple with 'r' or 'w' for the first element and a positive
+        count for the second.
+
+    _lockfile
+        Open file used for locking.
     """
-    _lockmode = None
     base = None
+    _lock_mode = None
     
     def __init__(self, base, init=False, find_root=True, lock_mode='w'):
         """Create new branch object at a particular location.
@@ -119,7 +124,7 @@
                                      ['use "bzr init" to initialize a new working tree',
                                       'current bzr can only operate from top-of-tree'])
         self._check_format()
-        self._lockfile = None
+        self._lockfile = self.controlfile('branch-lock', 'wb')
         self.lock(lock_mode)
 
         self.text_store = ImmutableStore(self.controlfilename('text-store'))
@@ -134,53 +139,44 @@
     __repr__ = __str__
 
 
-
-    def lock(self, mode='w'):
-        """Lock the on-disk branch, excluding other processes."""
-        try:
-            import fcntl, errno
-
-            if mode == 'w':
-                lm = fcntl.LOCK_EX
-                om = os.O_WRONLY | os.O_CREAT
-            elif mode == 'r':
-                lm = fcntl.LOCK_SH
-                om = os.O_RDONLY
-            else:
-                raise BzrError("invalid locking mode %r" % mode)
-
-            try:
-                lockfile = os.open(self.controlfilename('branch-lock'), om)
-            except OSError, e:
-                if e.errno == errno.ENOENT:
-                    # might not exist on branches from <0.0.4
-                    self.controlfile('branch-lock', 'w').close()
-                    lockfile = os.open(self.controlfilename('branch-lock'), om)
-                else:
-                    raise e
-            
-            fcntl.lockf(lockfile, lm)
-            def unlock():
-                fcntl.lockf(lockfile, fcntl.LOCK_UN)
-                os.close(lockfile)
-                self._lockmode = None
-            self.unlock = unlock
-            self._lockmode = mode
-        except ImportError:
-            import warnings
-            warnings.warning("please write a locking method for platform %r" % sys.platform)
-            def unlock():
-                self._lockmode = None
-            self.unlock = unlock
-            self._lockmode = mode
+    def __del__(self):
+        if self._lock_mode:
+            from warnings import warn
+            warn("branch %r was not explicitly unlocked" % self)
+            self.unlock()
+
+
+    def lock(self, mode):
+        if self._lock_mode:
+            raise BzrError('branch %r is already locked: %r' % (self, self._lock_mode))
+
+        from bzrlib.lock import lock, LOCK_SH, LOCK_EX
+        if mode == 'r':
+            m = LOCK_SH
+        elif mode == 'w':
+            m = LOCK_EX
+        else:
+            raise ValueError('invalid lock mode %r' % mode)
+        
+        lock(self._lockfile, m)
+        self._lock_mode = (mode, 1)
+
+
+    def unlock(self):
+        if not self._lock_mode:
+            raise BzrError('branch %r is not locked' % (self))
+        from bzrlib.lock import unlock
+        unlock(self._lockfile)
+        self._lock_mode = None
 
 
     def _need_readlock(self):
-        if self._lockmode not in ['r', 'w']:
+        if not self._lock_mode:
             raise BzrError('need read lock on branch, only have %r' % self._lockmode)
 
+
     def _need_writelock(self):
-        if self._lockmode not in ['w']:
+        if (self._lock_mode == None) or (self._lock_mode[0] != 'w'):
             raise BzrError('need write lock on branch, only have %r' % self._lockmode)
 
 



More information about the Pkg-bazaar-commits mailing list