X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/b8c4bdf48d61f3c1eb6b835d51c91fd4cf4f370f..ff3dc91d38ee542dbb79c94ac910b43c2985b58e:/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 250078e..ca90714 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,10 +1,13 @@ import unittest +from fcntl import flock, LOCK_EX, LOCK_UN +from os import remove class struct(object): 'A simple namespace object.' - def __init__(self, d = {}): + def __init__(self, d = {}, **kwargs): 'd is the dictionary to update my __dict__ with.' self.__dict__.update(d) + self.__dict__.update(kwargs) def dicts2struct(x): """ @@ -18,10 +21,41 @@ def dicts2struct(x): else: return x -def wrap(rsrc, func): - "Utility to that emulates with Python 2.5's `with closing(rsrc)`." - try: return func(rsrc) - finally: rsrc.close() +# +# 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 + +# +# Tests. +# class common_tests(unittest.TestCase): def test_dicts2structs(self):