From: Philip Jenvey Date: Thu, 23 Jul 2009 01:08:17 +0000 (+0000) Subject: add/strengthen guards for concurrent GC X-Git-Tag: rel_0_6_6~83 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee8ca41721a5bf02759db0054f952db0308a7688;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git add/strengthen guards for concurrent GC --- diff --git a/lib/sqlalchemy/orm/identity.py b/lib/sqlalchemy/orm/identity.py index 4f2e8450be..b7d4234f4c 100644 --- a/lib/sqlalchemy/orm/identity.py +++ b/lib/sqlalchemy/orm/identity.py @@ -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 diff --git a/lib/sqlalchemy/orm/state.py b/lib/sqlalchemy/orm/state.py index f548d073b7..4d9fa5ade8 100644 --- a/lib/sqlalchemy/orm/state.py +++ b/lib/sqlalchemy/orm/state.py @@ -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): diff --git a/lib/sqlalchemy/test/engines.py b/lib/sqlalchemy/test/engines.py index a6e0fdf53f..187ad2ff03 100644 --- a/lib/sqlalchemy/test/engines.py +++ b/lib/sqlalchemy/test/engines.py @@ -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: