X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/c4e45141f8612ae5977869c4ea6babb777cf6bd6..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 3dc67a4..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,5 +1,8 @@ +from __future__ import with_statement + import unittest -from fcntl import flock, LOCK_EX, LOCK_UN +from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN +import contextlib as clib class struct(object): 'A simple namespace object.' @@ -20,46 +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. - - E.g., - @with_closing(file('/tmp/foo')) - def contents(f): - return f.read() - # now 'contents' is the contents of /tmp/foo - """ - def wrapper(func): - try: return func(rsrc) - finally: rsrc.close() - return wrapper - -def with_lock_file(path, exclusive = True): - """ - Context manager for lock files. Example: - - @with_lock_file('/tmp/mylock') - def input(): - print 'locked' - return raw_input() - # prints 'locked' - print input # prints what raw_input() returned - """ - def wrapper(func): - @with_closing(file(path, 'w')) - def g(f): - if exclusive: locktype = LOCK_EX - else: locktype = LOCK_SH - flock(f, locktype) - try: return func() - finally: flock(f, LOCK_UN) - 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.