From 432ff76035efafba73a81bab5b0c12482acdb1fe Mon Sep 17 00:00:00 2001 From: Justin Bronn Date: Mon, 31 Jan 2011 20:12:23 +0000 Subject: [PATCH] [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 --- .../contrib/gis/geos/prototypes/threadsafe.py | 22 ++++++++----------- 1 file 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)