diff options
| author | Justin Bronn <jbronn@gmail.com> | 2011-01-31 20:11:19 +0000 |
|---|---|---|
| committer | Justin Bronn <jbronn@gmail.com> | 2011-01-31 20:11:19 +0000 |
| commit | 553adfa6d12487ea24e1a6812851cd0a6fe810a3 (patch) | |
| tree | 96a530ce8fa33ab4203b7947a1138090d2106465 | |
| parent | b8a8066ac47b50316a14b88f1e3fb236bc03576f (diff) | |
Fixed #13488 -- No longer generate unhandled exceptions that may occur when destructors of global GEOS I/O objects are called on process termination.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@15378 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) |
