X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/ff3dc91d38ee542dbb79c94ac910b43c2985b58e..e2cb1724053e67a4bb14b0b2c9d848e771d53a7e:/files/usr/share/python-support/sipb-xen-base/invirt/common.py diff --git a/files/usr/share/python-support/sipb-xen-base/invirt/common.py b/files/usr/share/python-support/sipb-xen-base/invirt/common.py index ca90714..77770a6 100644 --- a/files/usr/share/python-support/sipb-xen-base/invirt/common.py +++ b/files/usr/share/python-support/sipb-xen-base/invirt/common.py @@ -1,6 +1,8 @@ +from __future__ import with_statement + import unittest -from fcntl import flock, LOCK_EX, LOCK_UN -from os import remove +from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN +import contextlib as clib class struct(object): 'A simple namespace object.' @@ -21,37 +23,18 @@ def dicts2struct(x): else: return x -# -# Hacks to work around lack of Python 2.5's `with` statement. -# - -def with_closing(rsrc): - "Utility to emulate Python 2.5's `with closing(rsrc)` context manager." - def wrapper(func): - try: return func(rsrc) - finally: rsrc.close() - return wrapper - -def with_lock_file(path): - """ - Context manager for lock files. Example: - - @with_lock_file('/tmp/mylock') - def input(): - print 'locked' - return raw_input() - # decorator is executed immediately - print input # prints the input text - """ - def wrapper(func): - @with_closing(file(path, 'w')) - def g(f): - flock(f, LOCK_EX) - try: return func() - finally: flock(f, LOCK_UN) - remove(path) - return g - return wrapper +@clib.contextmanager +def lock_file(path, exclusive = True): + with clib.closing(file(path, 'w')) as f: + if exclusive: + locktype = LOCK_EX + else: + locktype = LOCK_SH + flock(f, locktype) + try: + yield + finally: + flock(f, LOCK_UN) # # Tests.