SWIG mapscript critical problems!!!
Sean Gillies
sgillies at FRII.COM
Mon Jun 19 11:12:42 EDT 2006
On Jun 19, 2006, at 8:56 AM, Steve Lime wrote:
> I was thinking more of a high level use case for testing then we
> implement =
> as
> necessary in the appropriate bindings. (that might be nice generally)
>
> The problem is that users create oprhaned objects in absence of a
> parent =
> correct
> - e.g. a layerObj without a mapObj. I'm curious what users do
> with these =
> objects=20
> once created and if it makes sense to even allow this behavior.
>
> Are users creating, for example, a layerObj and then building it
> out and =
> finally=20
> calling insertLayer to add it to a mapObj? That seems like the
> situtation =
> where
> ownership of memory would be an issue. Perhaps the insert methods
> need to
> be changed (e.g. return the pointer to the inserted object which is
> a copy =
> of
> the original rather than dealing with typemaps for every language.
>
> Steve
Steve, that is exactly what the insert methods do. They make a copy
and return a reference.
Sean
>
>>>> "Tamas Szekeres" <szekerest at gmail.com> 6/17/2006 4:18:07 PM >>>
> Steve,
>
> Unfortunately it is not so easy to write generic test applications
> for all
> of the swig bindings. It would require to rewrite the test for all
> of the
> languages. However, it would be desirable in the future and could be
> realized using a code generator (if any) that can translate a
> pseudocode =
> to
> the different languages.
>
> This time all i can do is to interpret the problem, make the tests
> for C#,
> creating a proposal for the fix (solely for C# or generally if
> possible) =
> and
> let the maintainers of the other languages decide if the problem
> applies =
> to
> them and they want to make their own tests. That was the purpose of
> this
> thread was initially posted.
>
> I cannot decide whether these issues apply to the PHP mapscript and
> i =
> cannot
> be sure about the other SWIG languages, because it would take a
> long time =
> to
> identify the differences and similarities between the several
> interface
> implementations. The java binding seems to be similar to the C#
> implementation, therefore the problems described here applies to
> java as
> well.
>
> Further on i will address the C# interface but one can easily
> interpret =
> the
> assumptions also for the others.
>
> SWIG C# transforms the C structs to C# classes. All of these
> classes have =
> a
> reference to the native memory (called swigCPtr) that holds the
> wrapped C
> struct.
> The C# objects also have a flag (swigCMemOwn) that indicates that
> the =
> memory
> should be handled internally and destroyed during the object
> destruction.
> If this flag is set the release of the memory will take place when
> the =
> user
> calls the predefinied Dispose method or when the C# object will not
> have =
> any
> further references and the garbage collector will destroy the object.
>
> Both of the problems mentioned are dedicated to the improper
> handling of =
> the
> swigCMemOwn property. There are some cases when the referenced
> native =
> memory
> is normally destroyed by the mapserver code (within libmap.dll for =
> example).
> If swigCMemOwn is set the memory is candidate to be freed twice.
>
> This situation can be produced by several different ways. <b>The
> reason of
> these problems is that swig is not properly notified whether the
> ownership
> of the memory should be transferred.</b>
>
> 1. Constructing layers from scratch (not declared by map file) is a
> common
> situation for this issue.
> We have the following constructors to create a layer or the subsequent
> objects dynamically:
>
> layerObj(mapObj map)
> classObj(layerObj layer)
> styleObj(classObj parent_class)
>
> A new object is created with swigCMemOwn=3Dtrue by default. If one
> gives =
> not
> null parameter for these constructors. The object (referenced by the
> parameter) will take the ownership of the
> memory referenced by the swigCPtr of the newly created object.
> Therefore
> swigCMemOwn should be set to false (the object should be "disowned"
> in the
> swig terminology) The current C# fix does exactly this by adding for
> example:
>
> %typemap(csconstruct, excode=3DSWIGEXCODE) layerObj(mapObj map) %{:
> this($imcall, true) {
> if (map !=3D null) this.swigCMemOwn =3D false;$excode
> }
> %}
>
> 2. Passing objects as parameters is the next area where improper
> ownership
> may occur.
> If a wrapped C struct has another struct or pointer to a struct
> that is =
> not
> readonly implies to create setter functions that have another
> object as a
> parameter.
> If the outer struct takes the ownership of this struct (and will
> free it
> later) the object should be "disowned" by swig that is: swigCMemOwn
> should
> be set to false in the C# wrapper object.
>
> The more complicated case is if the inner element is a struct
> itself. SWIG
> will make a raw copy of the struct, however the referenced inner
> elements =
> of
> the internal struct (char* represented strings for example) are not =
> copied.
>
> In my opinion it is the best to avoid such a situation mentioned
> before =
> and
> eliminate these elements from the interface if the functionality
> can be
> achieved in other ways.
> If the usage of the interface element is inevitable proper handling
> of the
> object ownership is needed.
> It must be noted that how an object handles an inner object is
> somewhat
> apllication specific so these issues cannot be considered as a bug
> for the
> SWIG interface generator.
>
>
> Best Regards,
>
> Tamas
>
>
>
> -----Original Message-----
> From: Steve Lime [mailto:Steve.Lime at dnr.state.mn.us]=20
> Sent: Friday, June 16, 2006 11:10 PM
> To: szekerest at GMAIL.COM; MAPSERVER-DEV at LISTS.UMN.EDU=20
> Subject: Re: [UMN_MAPSERVER-DEV] SWIG mapscript critical problems!!!
>
> Can we come up with a generic test case to apply in each language?
> It =
> seems
> like these issues would a result of architecture as opposed to SWIG
> itself
> so=20
> PHP/MapScript should be looked at too. C# might just be better at =
> bringing=20
> issues to the surface.
>
> Steve
>
>>>> Tamas Szekeres <szekerest at GMAIL.COM> 6/16/2006 11:09:44 AM >>>
> Developers,
>
> Along with the recent postings on the user's list some of the folks
> are complaining about funky
> segfaults, memory reference exceptions when using some of the
> mapscript
> objects.
>
> I have found the following problems and would like to know if these
> issues apply to the other languages or not.
>
> http://mapserver.gis.umn.edu/bugs/show_bug.cgi?id=3D1803=20
> http://mapserver.gis.umn.edu/bugs/show_bug.cgi?id=3D1743=20
>
> Best Regards,
>
> Tamas
>
> --=20
> No virus found in this incoming message.
> Checked by AVG Free Edition.
> Version: 7.1.394 / Virus Database: 268.9.0/368 - Release Date:
> 2006.06.16.
> =20
>
> --=20
> No virus found in this outgoing message.
> Checked by AVG Free Edition.
> Version: 7.1.394 / Virus Database: 268.9.0/368 - Release Date:
> 2006.06.16.
> =20
---
Sean Gillies
http://zcologia.com
More information about the mapserver-dev
mailing list