diff -r 7f798c38beea django/contrib/gis/geos/prototypes/threadsafe.py
a
|
b
|
|
20 | 20 | |
21 | 21 | thread_context = GEOSContext() |
22 | 22 | |
23 | | def call_geos_threaded(cfunc, args): |
24 | | """ |
25 | | This module-level routine calls the specified GEOS C thread-safe |
26 | | function with the context for this current thread. |
27 | | """ |
28 | | # If a context handle does not exist for this thread, initialize one. |
29 | | if not thread_context.handle: |
30 | | thread_context.handle = GEOSContextHandle() |
31 | | # Call the threaded GEOS routine with pointer of the context handle |
32 | | # as the first argument. |
33 | | return cfunc(thread_context.handle.ptr, *args) |
34 | | |
35 | 23 | class GEOSFunc(object): |
36 | 24 | """ |
37 | 25 | Class that serves as a wrapper for GEOS C Functions, and will |
… |
… |
|
43 | 31 | # take an additional context handle parameter. |
44 | 32 | self.cfunc = getattr(lgeos, func_name + '_r') |
45 | 33 | self.threaded = True |
| 34 | # Create a reference here to thread_context so it's not |
| 35 | # garbage-collected before an attempt to call this object. |
| 36 | self.thread_context = thread_context |
46 | 37 | except AttributeError: |
47 | 38 | # Otherwise, use usual function. |
48 | 39 | self.cfunc = getattr(lgeos, func_name) |
… |
… |
|
50 | 41 | |
51 | 42 | def __call__(self, *args): |
52 | 43 | if self.threaded: |
53 | | return call_geos_threaded(self.cfunc, args) |
| 44 | # If a context handle does not exist for this thread, initialize one. |
| 45 | if not self.thread_context.handle: |
| 46 | self.thread_context.handle = GEOSContextHandle() |
| 47 | # Call the threaded GEOS routine with pointer of the context handle |
| 48 | # as the first argument. |
| 49 | return self.cfunc(self.thread_context.handle.ptr, *args) |
54 | 50 | else: |
55 | 51 | return self.cfunc(*args) |
56 | 52 | |