diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-11-18 17:31:09 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-11-18 17:31:09 +0000 |
commit | 08a434881faa14eab8f17274b97af042903eaba9 (patch) | |
tree | 7016c1cd5fad8bde42dd8c837c0b592992e65feb | |
parent | 68027f623a8383aa024e0c8e18743b836136c2be (diff) | |
download | sqlalchemy-08a434881faa14eab8f17274b97af042903eaba9.tar.gz |
- added a little more checking for garbage-collection dereferences in
InstanceState.__cleanup() to reduce "gc ignored" errors on app
shutdown
-rw-r--r-- | CHANGES | 6 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/attributes.py | 16 |
2 files changed, 16 insertions, 6 deletions
@@ -107,7 +107,11 @@ CHANGES - fixed error where Query.add_column() would not accept a class-bound attribute as an argument; Query also raises an error if an invalid argument was sent to add_column() (at instances() time) [ticket:858] - + + - added a little more checking for garbage-collection dereferences in + InstanceState.__cleanup() to reduce "gc ignored" errors on app + shutdown + - The session API has been solidified: - It's an error to session.save() an object which is already diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index 6cf2b74e9..27f4b017c 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -557,19 +557,25 @@ class InstanceState(object): self.instance_dict = None def __cleanup(self, ref): - if self.instance_dict is None or self.instance_dict() is None: + # tiptoe around Python GC unpredictableness + instance_dict = self.instance_dict + if instance_dict is None: return - instance_dict = self.instance_dict() - + instance_dict = instance_dict() + if instance_dict is None: + return + # the mutexing here is based on the assumption that gc.collect() # may be firing off cleanup handlers in a different thread than that # which is normally operating upon the instance dict. instance_dict._mutex.acquire() try: # if instance_dict de-refed us, or it called our - # _resurrect, return - if self.instance_dict is None or self.instance_dict() is None or self.obj() is not None: + # _resurrect, return. again setting local copy + # to avoid the rug being pulled in between + id2 = self.instance_dict + if id2 is None or id2() is None or self.obj() is not None: return self.__resurrect(instance_dict) |