]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
add/strengthen guards for concurrent GC
authorPhilip Jenvey <pjenvey@underboss.org>
Thu, 23 Jul 2009 01:08:17 +0000 (01:08 +0000)
committerPhilip Jenvey <pjenvey@underboss.org>
Thu, 23 Jul 2009 01:08:17 +0000 (01:08 +0000)
lib/sqlalchemy/orm/identity.py
lib/sqlalchemy/orm/state.py
lib/sqlalchemy/test/engines.py

index 4f2e8450be83a890f85203fc4576b4305d7d88d8..b7d4234f4c1001b31fc28cfe59d0990d98887d17 100644 (file)
@@ -45,7 +45,7 @@ class IdentityMap(dict):
         self._modified.discard(state)
 
     def _dirty_states(self):
-        return self._modified.union(s for s in list(self._mutable_attrs)
+        return self._modified.union(s for s in self._mutable_attrs.copy()
                                     if s.modified)
 
     def check_modified(self):
@@ -54,7 +54,7 @@ class IdentityMap(dict):
         if self._modified:
             return True
         else:
-            for state in list(self._mutable_attrs):
+            for state in self._mutable_attrs.copy():
                 if state.modified:
                     return True
         return False
index f548d073b7365024af3f86fe7d7a0ce5f2445566..4d9fa5ade8532c22f6cf53e64d0a2db9577d136e 100644 (file)
@@ -31,11 +31,17 @@ class InstanceState(object):
         
     def detach(self):
         if self.session_id:
-            del self.session_id
+            try:
+                del self.session_id
+            except AttributeError:
+                pass
 
     def dispose(self):
         if self.session_id:
-            del self.session_id
+            try:
+                del self.session_id
+            except AttributeError:
+                pass
         del self.obj
     
     def _cleanup(self, ref):
index a6e0fdf53f5effce8ac2ba461fa91404e68921a1..187ad2ff036a40d8c8739cc0d941e5171423747f 100644 (file)
@@ -12,7 +12,8 @@ class ConnectionKiller(object):
         self.proxy_refs[con_proxy] = True
 
     def _apply_all(self, methods):
-        for rec in list(self.proxy_refs):
+        # must copy keys atomically
+        for rec in self.proxy_refs.keys():
             if rec is not None and rec.is_valid:
                 try:
                     for name in methods: