Strange mapscriptJNI_delete_1layerObj+0xf error killing Tomcat
Arkadi Shishlov
arkadi at MEBIUS.LV
Fri Jun 1 06:47:11 PDT 2007
Tamas Szekeres wrote:
> This error happened when the garbage collector have destroyed a free
> standing layer object. The C memory of that object have been
> implicitly destroyed previously upon the destruction of the parent map
> object.
>
> It seems to me that you are possibly using the 'layerObj(mapObj map)'
> constructor somewhere in your code for creating new layers dynamically
> and adding to a map. I don't know whether it have handled for java so
> far, but it is potentially unsafe for SWIG and RFC-24 is dedicated to
> treat this issue (among other problems).
>
> If this statement applies to your code I would suggest to use the
> layerObj(null) constructor and using insertLayer for adding the layer
> to the map instead.
>
> This issue also applies to the 'classObj(layerObj layer)' and
> styleObj(classObj parent_class) constructors as well.
This indeed solved my problems too.
After implementing insertClass/Style, using styleObj.getColor().setHex() to set color, and always
working with a label returned by classObj.getLabel() the application is stable for some time.
Previously it was crashing every 10 minutes.
I'm also interested what is the semantic of shapeObj.add() and layerObj.addFeature()?
shapeObj o = new shapeObj(MS_SHAPE_TYPE.MS_SHAPE_POINT.swigValue());
lineObj n = new lineObj();
n.add(rulerXY1);
o.add(n);
layer.addFeature(o);
Then both shape and line goes out of scope. Is it prone to crash?
These are the helpers for reference:
protected layerObj getLayer(String name)
{
layerObj layer = map.getLayerByName(name);
if (layer == null) {
layer = new layerObj(null);
layer.setName(name);
map.insertLayer(layer, -1);
layer = map.getLayerByName(name);
}
return layer;
}
protected classObj allocClass(layerObj layer)
{
int i = layer.insertClass(new classObj(null), -1);
return layer.getClass(i);
}
protected styleObj allocStyle(classObj c)
{
int i = c.insertStyle(new styleObj(null), -1);
return c.getStyle(i);
}
protected classObj getFirstClass(layerObj layer)
{
if (layer.getNumclasses() > 0)
return layer.getClass(0);
return allocClass(layer);
}
protected styleObj getFirstStyle(classObj c)
{
if (c.getNumstyles() > 0)
return c.getStyle(0);
return allocStyle(c);
}
More information about the MapServer-users
mailing list