oops
[invirt/packages/invirt-base.git] / files / usr / share / python-support / sipb-xen-base / invirt / common.py
index 250078e..d986196 100644 (file)
@@ -1,10 +1,12 @@
 import unittest
+from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN
 
 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 +20,50 @@ 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.
+
+    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
+
+#
+# Tests.
+#
 
 class common_tests(unittest.TestCase):
     def test_dicts2structs(self):