diff options
author | Justin Bronn <jbronn@gmail.com> | 2011-01-31 20:12:23 +0000 |
---|---|---|
committer | Justin Bronn <jbronn@gmail.com> | 2011-01-31 20:12:23 +0000 |
commit | 432ff76035efafba73a81bab5b0c12482acdb1fe (patch) | |
tree | 68de2186d95ebe0c21627c6e5045ae325a50394f | |
parent | 776bf6e5f7d83d3a9cd41f74277106365280f574 (diff) | |
download | django-432ff76035efafba73a81bab5b0c12482acdb1fe.tar.gz |
[1.2.X] Fixed #13488 -- No longer generate unhandled exceptions that may occur when destructors of global GEOS I/O objects are called on process termination.
Backport of r15378 from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15379 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r-- | django/contrib/gis/geos/prototypes/threadsafe.py | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/django/contrib/gis/geos/prototypes/threadsafe.py b/django/contrib/gis/geos/prototypes/threadsafe.py index 5888ed16e2..2c9d25ee9f 100644 --- a/django/contrib/gis/geos/prototypes/threadsafe.py +++ b/django/contrib/gis/geos/prototypes/threadsafe.py @@ -20,18 +20,6 @@ class GEOSContext(threading.local): thread_context = GEOSContext() -def call_geos_threaded(cfunc, args): - """ - This module-level routine calls the specified GEOS C thread-safe - function with the context for this current thread. - """ - # If a context handle does not exist for this thread, initialize one. - if not thread_context.handle: - thread_context.handle = GEOSContextHandle() - # Call the threaded GEOS routine with pointer of the context handle - # as the first argument. - return cfunc(thread_context.handle.ptr, *args) - class GEOSFunc(object): """ Class that serves as a wrapper for GEOS C Functions, and will @@ -43,6 +31,9 @@ class GEOSFunc(object): # take an additional context handle parameter. self.cfunc = getattr(lgeos, func_name + '_r') self.threaded = True + # Create a reference here to thread_context so it's not + # garbage-collected before an attempt to call this object. + self.thread_context = thread_context except AttributeError: # Otherwise, use usual function. self.cfunc = getattr(lgeos, func_name) @@ -50,7 +41,12 @@ class GEOSFunc(object): def __call__(self, *args): if self.threaded: - return call_geos_threaded(self.cfunc, args) + # If a context handle does not exist for this thread, initialize one. + if not self.thread_context.handle: + self.thread_context.handle = GEOSContextHandle() + # Call the threaded GEOS routine with pointer of the context handle + # as the first argument. + return self.cfunc(self.thread_context.handle.ptr, *args) else: return self.cfunc(*args) |