[Checkins] SVN: ZODB/branches/jim-zeo-blob/src/ZODB/lock_file.py Updated to provide a catchable exception.

Jim Fulton jim at zope.com
Wed May 16 13:30:49 EDT 2007


Log message for revision 75808:
  Updated to provide a catchable exception.
  

Changed:
  U   ZODB/branches/jim-zeo-blob/src/ZODB/lock_file.py

-=-
Modified: ZODB/branches/jim-zeo-blob/src/ZODB/lock_file.py
===================================================================
--- ZODB/branches/jim-zeo-blob/src/ZODB/lock_file.py	2007-05-16 17:12:54 UTC (rev 75807)
+++ ZODB/branches/jim-zeo-blob/src/ZODB/lock_file.py	2007-05-16 17:30:48 UTC (rev 75808)
@@ -17,31 +17,49 @@
 import logging
 logger = logging.getLogger("ZODB.lock_file")
 
+class LockError(Exception):
+    """Couldn't lock a file
+    """
+
 try:
     import fcntl
 except ImportError:
     try:
-        from winlock import LockFile as _LockFile
-        from winlock import UnlockFile as _UnlockFile
+        import ZODB.winlock
     except ImportError:
-        def lock_file(file):
-            logger.info('No file-locking support on this platform')
+        def _lock_file(file):
+            raise TypeError('No file-locking support on this platform')
+        def _unlock_file(file):
+            raise TypeError('No file-locking support on this platform')
 
-    # Windows
-    def lock_file(file):
-        # Lock just the first byte
-        _LockFile(file.fileno(), 0, 0, 1, 0)
+    else:
+        # Windows
+        def _lock_file(file):
+            # Lock just the first byte
+            try:
+                ZODB.winlock.LockFile(file.fileno())
+            except ZODB.winlock.LockError:
+                raise LockError("Couldn't lock %r", file.name)
+            
 
-    def unlock_file(file):
-        _UnlockFile(file.fileno(), 0, 0, 1, 0)
+        def _unlock_file(file):
+            try:
+                ZODB.winlock.UnlockFile(file.fileno())
+            except ZODB.winlock.LockError:
+                raise LockError("Couldn't unlock %r", file.name)
+                
 else:
     # Unix
     _flags = fcntl.LOCK_EX | fcntl.LOCK_NB
 
-    def lock_file(file):
-        fcntl.flock(file.fileno(), _flags)
+    def _lock_file(file):
+        try:
+            fcntl.flock(file.fileno(), _flags)
+        except IOError:
+            raise LockError("Couldn't lock %r", file.name)
+            
 
-    def unlock_file(file):
+    def _unlock_file(file):
         # File is automatically unlocked on close
         pass
 
@@ -51,6 +69,7 @@
 # Creating the instance acquires the lock.  The file remains open.  Calling
 # close both closes and unlocks the lock file.
 class LockFile:
+
     def __init__(self, path):
         self._path = path
         try:
@@ -60,7 +79,7 @@
             self._fp = open(path, 'w+')
         # Acquire the lock and piss on the hydrant
         try:
-            lock_file(self._fp)
+            _lock_file(self._fp)
         except:
             logger.exception("Error locking file %s", path)
             raise
@@ -69,7 +88,7 @@
 
     def close(self):
         if self._fp is not None:
-            unlock_file(self._fp)
+            _unlock_file(self._fp)
             self._fp.close()
             os.unlink(self._path)
             self._fp = None



More information about the Checkins mailing list