python: Added a global wsgidir module attribute to indicate currentness.
authorFredrik Tolf <fredrik@dolda2000.com>
Sat, 17 May 2014 02:05:30 +0000 (04:05 +0200)
committerFredrik Tolf <fredrik@dolda2000.com>
Sat, 17 May 2014 02:05:30 +0000 (04:05 +0200)
python3/ashd/wsgidir.py

index c6fa1ad..9fc3649 100644 (file)
@@ -58,6 +58,20 @@ class cachedmod(object):
         self.mod = mod
         self.mtime = mtime
 
+class current(object):
+    def __init__(self):
+        self.cond = threading.Condition()
+        self.current = True
+    def wait(self, timeout=None):
+        with self.cond:
+            self.cond.wait(timeout)
+    def uncurrent(self):
+        with self.cond:
+            self.current = False
+            self.cond.notify_all()
+    def __bool__(self):
+        return self.current
+
 modcache = {}
 cachelock = threading.Lock()
 
@@ -97,8 +111,16 @@ def getmod(path):
             code = compile(text, path, "exec")
             mod = types.ModuleType(mangle(path))
             mod.__file__ = path
-            exec(code, mod.__dict__)
-            entry[1] = cachedmod(mod, sb.st_mtime)
+            mod.__current__ = current()
+            try:
+                exec(code, mod.__dict__)
+            except:
+                mod.__current__.uncurrent()
+                raise
+            else:
+                if entry[1] is not None:
+                    entry[1].mod.__current__.uncurrent()
+                entry[1] = cachedmod(mod, sb.st_mtime)
         return entry[1]
 
 def importlocal(filename):