Hi Sean,

finally, the solution to the problem is attached to this mail.

basically in ctypes SDLL/PyDLL loaders, the contained function
arguments and return value are not reflected.
By default when calling a function without supplying any argtypes list
and restype ctype it is assumed that the
respective argument can be casted to int. However, in case of c_void_p
this only works on
32 bit platforms, where sizeof(c_size_t) = sizeof(c_int). All
pointers, such as c_void_p,
are of the same type as c_size_t.

This produces to SEGFAULTs on 64 bit platforms where-ever specifying
argtypes and restype has been omitted.

The bug only shows up when the pointer type > 2^32, otherwise python
converts the correct value to
c_void_p. On linux, and in my case at least it takes about 1500
mallocs to hit one in the high memory area where pointers are > 2^32.
This might well be the reason why the problem has not shown up until now.

However, I had no time to thoroughly search for all imports used, but
not declared. I would be grateful if you could include the patch
into rev 1.0.13. I would have patched the trunk, but the file
structure there seems pretty different from the 1.0.13 version, and I
did't' find the
c-declarations python file.


Thank you for maintaining such a wonderful lib,
Cheers

Paul

2009/10/5 Paul Balomiri <[email protected]>:
> Hi,
>
> I tried to find out where exactly BaseGeometry.__geom__ becomes int type.
>
> and here is what I found out:
>
>>>> p=Point(1.0,2.3)
> pointaddr=10373776
>>>> p
> <shapely.geometry.point.Point object at 0x7f7f7e8ebed0>
>>>> p.__geom__.__class__
> <type 'int'>
>
>
> OK, now going into the constructor of Point I could pinpoint
> Line #53 in point.py
>
> Creating a sequence there yielda an int instead of a c_void_p:
>
>>>> cs = lgeos.GEOSCoordSeq_create(1, 2)
>>>> cs.__class__
> <type 'int'>
>
> This seems strance as in
> http://trac.gispython.org/lab/browser/Shapely/tags/rel-1.0.13/shapely/ctypes_declarations.py#L26
> tou correctly defined
>
>  lgeos.GEOSCoordSeq_create.restype = ctypes.c_void_p
>
> So the only thing coming to my mind is that the c_type_declarations
> might somehow not be included ?
>
> Do you have any hints where to go from here ?
>
> Cheers Paul
>
> 2009/10/5 Paul Balomiri <[email protected]>:
>> Hi,
>> Now having gone deeper into the matter i found out a bug,
>> and can further get into details about when a segfault still occurs.
>> The relevant fact i did not mention last time is that i'm running
>> shapely on a 64 bit CPU.
>>
>> 1)  
>> http://trac.gispython.org/lab/browser/Shapely/tags/rel-1.0.13/shapely/geometry/base.py
>> ay line 352 you use
>>
>> size = c_int()
>>
>> and later on pass it as size size arg to GEOS' GEOSGeomToWKB_buf.
>> This is wrong on 64 bit processors.
>> Please use size = c_size_t() (8 byte long on 64 bit)
>>
>> 2) I could find what may be a corelated symptom, and easily to check:
>> the __geom__ type is int. This causes segfaults when the actual ponter type 
>> has
>> a value >2^32-1. I could not follow the code to the point where __geom__ is 
>> set,
>> but am searching for it. Perhaps you can give me a hint ?
>>
>>
>> 2009/10/5 Sean Gillies <[email protected]>:
>>> On Oct 3, 2009, at 7:52 PM, Paul Balomiri wrote:
>>>
>>>> Hi,
>>>>
>>>> I encountered a similar problem to
>>>> http://lists.osgeo.org/pipermail/geos-devel/2009-July/004280.html ,
>>>> which is
>>>> at the exact same execution point.
>>>>
>>>> I am using shapely 1.0.13. As the lib is linked with PyDLL into
>>>> python, the GIL (Global Interpreter Log) is used to schedule library
>>>> entrance ( = no python code (in any thread) runs concurrently),
>>>> so my first guess was, that an init error or an error in handling the
>>>> global Context might cause the segfault.
>>>>
>>>> The backtrace I got from gdb is
>>>>
>>>>
>>>> [Switching to Thread 0x7fffe7f076f0 (LWP 6598)]
>>>> geos::io::WKBWriter::write (this=0x7fffeff120c0, g...@0xd8005270,
>>>> o...@0x7fffeff11f50) at WKBWriter.cpp:77
>>>> 77              switch (g.getGeometryTypeId()) {
>>>> Current language:  auto; currently c++
>>>> (gdb) where
>>>> #0  geos::io::WKBWriter::write (this=0x7fffeff120c0, g...@0xd8005270,
>>>> o...@0x7fffeff11f50) at WKBWriter.cpp:77
>>>> #1  0x00007fffe6883549 in GEOSGeomToWKB_buf_r (extHandle=0xa5beb0,
>>>> g=0xd8005270, size=0x14407f0) at geos_ts_c.cpp:948
>>>> #2  0x00007fffe6aa53b8 in ffi_call_unix64 () at
>>>> /build/buildd/python2.6-2.6.2/Modules/_ctypes/libffi/src/x86/
>>>> unix64.S:75
>>>> Python stacktrace:
>>>>
>>>> [Python Stack]
>>>>
>>>> #46 0x0000000000417ae9 in _start () at ../sysdeps/x86_64/elf/start.S:
>>>> 113
>>>>
>>>> A full stacktrace is included as an attachment. I have augmented the
>>>> stacktrace with the python
>>>> stackframe where the stack frame is in python code.
>>>>
>>>> I was wondering why GEOSGeomToWKB_buf is called, but
>>>> GEOSGeomToWKB_buf_r appears on the stacktrace.
>>>>
>>>> I do use threads in the application, but  only the main thread has
>>>> calling points to shapely.
>>>> Also the application uses SQLAlchemy with the user defined Geometry
>>>> type from shapely. The gluecode is part of mapfish.
>>>>
>>>> Perhaps you have some ideas about why the segfault shows up. I'm not
>>>> familiar with the way
>>>> shapely handles GEOS c pointers. In gdb the geos geometry object
>>>> g...@0xd8005270 points to an adress
>>>>
>>>> trying to access the geometry object reveals
>>>>
>>>> (gdb) p g
>>>> $1 = (const geos::geom::Geometry &) @0xd8005270: <error reading
>>>> variable>
>>>>
>>>>
>>>> regards,
>>>> Paul
>>>
>>> Hi Paul,
>>>
>>> I'm sorry you're experiencing trouble with Shapely. If you can write a
>>> Python program that doesn't depend on MapFish or SQLAlchemy or PostGIS
>>> (I don't have that stack running right now) that reliably crashes,
>>> I'll get right on it. Maybe it's just a matter of writing out WKB from
>>> multiple threads at once.
>>>
>>> If you're using GEOS 3.1, the non-reentrant API is just a thin layer
>>> over the reentrant one, so EOSGeomToWKB_buf_r will always be called.
>>>
>>> Cheers,
>>>
>>> --
>>> Sean
>>>
>>> _______________________________________________
>>> Community mailing list
>>> [email protected]
>>> http://lists.gispython.org/mailman/listinfo/community
>>>
>>
>>
>>
>> --
>> [email protected]
>>
>
>
>
> --
> [email protected]
>



-- 
[email protected]

Attachment: Shapely.patch.rev1458
Description: Binary data

_______________________________________________
Community mailing list
[email protected]
http://lists.gispython.org/mailman/listinfo/community

Reply via email to