diff options
Diffstat (limited to 'webapp/django/core/files/locks.py')
-rw-r--r-- | webapp/django/core/files/locks.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/webapp/django/core/files/locks.py b/webapp/django/core/files/locks.py new file mode 100644 index 0000000000..98a11551a7 --- /dev/null +++ b/webapp/django/core/files/locks.py @@ -0,0 +1,70 @@ +""" +Portable file locking utilities. + +Based partially on example by Jonathan Feignberg <jdf@pobox.com> in the Python +Cookbook, licensed under the Python Software License. + + http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65203 + +Example Usage:: + + >>> from django.core.files import locks + >>> f = open('./file', 'wb') + >>> locks.lock(f, locks.LOCK_EX) + >>> f.write('Django') + >>> f.close() +""" + +__all__ = ('LOCK_EX','LOCK_SH','LOCK_NB','lock','unlock') + +system_type = None + +try: + import win32con + import win32file + import pywintypes + LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK + LOCK_SH = 0 + LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY + __overlapped = pywintypes.OVERLAPPED() + system_type = 'nt' +except (ImportError, AttributeError): + pass + +try: + import fcntl + LOCK_EX = fcntl.LOCK_EX + LOCK_SH = fcntl.LOCK_SH + LOCK_NB = fcntl.LOCK_NB + system_type = 'posix' +except (ImportError, AttributeError): + pass + +def fd(f): + """Get a filedescriptor from something which could be a file or an fd.""" + return hasattr(f, 'fileno') and f.fileno() or f + +if system_type == 'nt': + def lock(file, flags): + hfile = win32file._get_osfhandle(fd(file)) + win32file.LockFileEx(hfile, flags, 0, -0x10000, __overlapped) + + def unlock(file): + hfile = win32file._get_osfhandle(fd(file)) + win32file.UnlockFileEx(hfile, 0, -0x10000, __overlapped) +elif system_type == 'posix': + def lock(file, flags): + fcntl.flock(fd(file), flags) + + def unlock(file): + fcntl.flock(fd(file), fcntl.LOCK_UN) +else: + # File locking is not supported. + LOCK_EX = LOCK_SH = LOCK_NB = None + + # Dummy functions that don't do anything. + def lock(file, flags): + pass + + def unlock(file): + pass |