mirror of
https://git.osgeo.org/gitea/postgis/postgis
synced 2024-10-25 01:22:47 +00:00
Fixed memory alignment issues in force_*d*_recursive
git-svn-id: http://svn.osgeo.org/postgis/trunk@2029 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
parent
87ca119cf5
commit
80ad0eaf29
|
@ -712,13 +712,17 @@ void
|
||||||
lwgeom_force2d_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
lwgeom_force2d_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
||||||
{
|
{
|
||||||
LWGEOM_INSPECTED *inspected;
|
LWGEOM_INSPECTED *inspected;
|
||||||
int i;
|
int i,j,k;
|
||||||
size_t totsize=0;
|
size_t totsize=0;
|
||||||
size_t size=0;
|
size_t size=0;
|
||||||
int type;
|
int type;
|
||||||
|
uchar newtypefl;
|
||||||
LWPOINT *point = NULL;
|
LWPOINT *point = NULL;
|
||||||
LWLINE *line = NULL;
|
LWLINE *line = NULL;
|
||||||
LWPOLY *poly = NULL;
|
LWPOLY *poly = NULL;
|
||||||
|
POINTARRAY newpts;
|
||||||
|
POINTARRAY **nrings;
|
||||||
|
POINT2D p2d;
|
||||||
uchar *loc;
|
uchar *loc;
|
||||||
|
|
||||||
|
|
||||||
|
@ -731,10 +735,20 @@ lwgeom_force2d_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
||||||
if ( type == POINTTYPE )
|
if ( type == POINTTYPE )
|
||||||
{
|
{
|
||||||
point = lwpoint_deserialize(serialized);
|
point = lwpoint_deserialize(serialized);
|
||||||
|
TYPE_SETZM(newpts.dims, 0, 0);
|
||||||
|
newpts.npoints = 1;
|
||||||
|
newpts.serialized_pointlist = lwalloc(sizeof(POINT2D));
|
||||||
|
loc = newpts.serialized_pointlist;
|
||||||
|
getPoint2d_p(point->point, 0, &p2d);
|
||||||
|
memcpy(loc, &p2d, sizeof(POINT2D));
|
||||||
|
point->point = &newpts;
|
||||||
TYPE_SETZM(point->type, 0, 0);
|
TYPE_SETZM(point->type, 0, 0);
|
||||||
lwpoint_serialize_buf(point, optr, retsize);
|
lwpoint_serialize_buf(point, optr, retsize);
|
||||||
|
lwfree(newpts.serialized_pointlist);
|
||||||
|
lwfree(point);
|
||||||
|
|
||||||
#ifdef PGIS_DEBUG
|
#ifdef PGIS_DEBUG
|
||||||
elog(NOTICE, "lwgeom_force2d_recursive: it's a point, size:%d", *retsize);
|
lwnotice("lwgeom_force2d_recursive returning");
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -742,10 +756,31 @@ elog(NOTICE, "lwgeom_force2d_recursive: it's a point, size:%d", *retsize);
|
||||||
if ( type == LINETYPE )
|
if ( type == LINETYPE )
|
||||||
{
|
{
|
||||||
line = lwline_deserialize(serialized);
|
line = lwline_deserialize(serialized);
|
||||||
|
#ifdef PGIS_DEBUG
|
||||||
|
elog(NOTICE, "lwgeom_force2d_recursive: it's a line with %d points", line->points->npoints);
|
||||||
|
#endif
|
||||||
|
TYPE_SETZM(newpts.dims, 0, 0);
|
||||||
|
newpts.npoints = line->points->npoints;
|
||||||
|
newpts.serialized_pointlist = lwalloc(sizeof(POINT2D)*line->points->npoints);
|
||||||
|
#ifdef PGIS_DEBUG
|
||||||
|
elog(NOTICE, "lwgeom_force2d_recursive: %d bytes pointlist allocated", sizeof(POINT2D)*line->points->npoints);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
loc = newpts.serialized_pointlist;
|
||||||
|
for (j=0; j<line->points->npoints; j++)
|
||||||
|
{
|
||||||
|
getPoint2d_p(line->points, j, &p2d);
|
||||||
|
memcpy(loc, &p2d, sizeof(POINT2D));
|
||||||
|
loc+=sizeof(POINT2D);
|
||||||
|
}
|
||||||
|
line->points = &newpts;
|
||||||
TYPE_SETZM(line->type, 0, 0);
|
TYPE_SETZM(line->type, 0, 0);
|
||||||
lwline_serialize_buf(line, optr, retsize);
|
lwline_serialize_buf(line, optr, retsize);
|
||||||
|
lwfree(newpts.serialized_pointlist);
|
||||||
|
lwfree(line);
|
||||||
|
|
||||||
#ifdef PGIS_DEBUG
|
#ifdef PGIS_DEBUG
|
||||||
elog(NOTICE, "lwgeom_force2d_recursive: it's a line, size:%d", *retsize);
|
lwnotice("lwgeom_force2d_recursive returning");
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -753,28 +788,72 @@ elog(NOTICE, "lwgeom_force2d_recursive: it's a line, size:%d", *retsize);
|
||||||
if ( type == POLYGONTYPE )
|
if ( type == POLYGONTYPE )
|
||||||
{
|
{
|
||||||
poly = lwpoly_deserialize(serialized);
|
poly = lwpoly_deserialize(serialized);
|
||||||
|
TYPE_SETZM(newpts.dims, 0, 0);
|
||||||
|
newpts.npoints = 0;
|
||||||
|
newpts.serialized_pointlist = lwalloc(1);
|
||||||
|
nrings = lwalloc(sizeof(POINTARRAY *)*poly->nrings);
|
||||||
|
loc = newpts.serialized_pointlist;
|
||||||
|
for (j=0; j<poly->nrings; j++)
|
||||||
|
{
|
||||||
|
POINTARRAY *ring = poly->rings[j];
|
||||||
|
POINTARRAY *nring = lwalloc(sizeof(POINTARRAY));
|
||||||
|
TYPE_SETZM(nring->dims, 0, 0);
|
||||||
|
nring->npoints = ring->npoints;
|
||||||
|
nring->serialized_pointlist =
|
||||||
|
lwalloc(ring->npoints*sizeof(POINT2D));
|
||||||
|
loc = nring->serialized_pointlist;
|
||||||
|
for (k=0; k<ring->npoints; k++)
|
||||||
|
{
|
||||||
|
getPoint2d_p(ring, k, &p2d);
|
||||||
|
memcpy(loc, &p2d, sizeof(POINT2D));
|
||||||
|
loc+=sizeof(POINT2D);
|
||||||
|
}
|
||||||
|
nrings[j] = nring;
|
||||||
|
}
|
||||||
|
poly->rings = nrings;
|
||||||
TYPE_SETZM(poly->type, 0, 0);
|
TYPE_SETZM(poly->type, 0, 0);
|
||||||
lwpoly_serialize_buf(poly, optr, retsize);
|
lwpoly_serialize_buf(poly, optr, retsize);
|
||||||
|
lwfree(poly);
|
||||||
|
// TODO: free nrigs[*]->serialized_pointlist
|
||||||
|
|
||||||
#ifdef PGIS_DEBUG
|
#ifdef PGIS_DEBUG
|
||||||
elog(NOTICE, "lwgeom_force2d_recursive: it's a poly, size:%d", *retsize);
|
lwnotice("lwgeom_force2d_recursive returning");
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( type != MULTIPOINTTYPE && type != MULTIPOLYGONTYPE &&
|
||||||
|
type != MULTILINETYPE && type != COLLECTIONTYPE )
|
||||||
|
{
|
||||||
|
lwerror("lwgeom_force2d_recursive: unknown geometry: %d",
|
||||||
|
type);
|
||||||
|
}
|
||||||
|
|
||||||
// OK, this is a collection, so we write down its metadata
|
// OK, this is a collection, so we write down its metadata
|
||||||
// first and then call us again
|
// first and then call us again
|
||||||
|
|
||||||
#ifdef PGIS_DEBUG
|
#ifdef PGIS_DEBUG
|
||||||
elog(NOTICE, "lwgeom_force2d_recursive: it's a collection (type:%d)", type);
|
lwnotice("lwgeom_force2d_recursive: it's a collection (%s)", lwgeom_typename(type));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Add type
|
// Add type
|
||||||
*optr = lwgeom_makeType_full(0, 0, lwgeom_hasSRID(serialized[0]),
|
newtypefl = lwgeom_makeType_full(0, 0, lwgeom_hasSRID(serialized[0]),
|
||||||
type, lwgeom_hasBBOX(serialized[0]));
|
type, lwgeom_hasBBOX(serialized[0]));
|
||||||
|
optr[0] = newtypefl;
|
||||||
optr++;
|
optr++;
|
||||||
totsize++;
|
totsize++;
|
||||||
loc=serialized+1;
|
loc=serialized+1;
|
||||||
|
|
||||||
|
#ifdef PGIS_DEBUG
|
||||||
|
lwnotice("lwgeom_force2d_recursive: added collection type (%s[%s]) - size:%d", lwgeom_typename(type), lwgeom_typeflags(newtypefl), totsize);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( lwgeom_hasBBOX(serialized[0]) != lwgeom_hasBBOX(newtypefl) )
|
||||||
|
lwerror("typeflag mismatch in BBOX");
|
||||||
|
if ( lwgeom_hasSRID(serialized[0]) != lwgeom_hasSRID(newtypefl) )
|
||||||
|
lwerror("typeflag mismatch in SRID");
|
||||||
|
|
||||||
// Add BBOX if any
|
// Add BBOX if any
|
||||||
if (lwgeom_hasBBOX(serialized[0]))
|
if (lwgeom_hasBBOX(serialized[0]))
|
||||||
{
|
{
|
||||||
|
@ -782,6 +861,9 @@ elog(NOTICE, "lwgeom_force2d_recursive: it's a collection (type:%d)", type);
|
||||||
optr += sizeof(BOX2DFLOAT4);
|
optr += sizeof(BOX2DFLOAT4);
|
||||||
totsize += sizeof(BOX2DFLOAT4);
|
totsize += sizeof(BOX2DFLOAT4);
|
||||||
loc += sizeof(BOX2DFLOAT4);
|
loc += sizeof(BOX2DFLOAT4);
|
||||||
|
#ifdef PGIS_DEBUG
|
||||||
|
lwnotice("lwgeom_force2d_recursive: added collection bbox - size:%d", totsize);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add SRID if any
|
// Add SRID if any
|
||||||
|
@ -791,18 +873,24 @@ elog(NOTICE, "lwgeom_force2d_recursive: it's a collection (type:%d)", type);
|
||||||
optr += 4;
|
optr += 4;
|
||||||
totsize += 4;
|
totsize += 4;
|
||||||
loc += 4;
|
loc += 4;
|
||||||
|
#ifdef PGIS_DEBUG
|
||||||
|
lwnotice("lwgeom_force2d_recursive: added collection SRID - size:%d", totsize);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add numsubobjects
|
// Add numsubobjects
|
||||||
memcpy(optr, loc, 4);
|
memcpy(optr, loc, sizeof(uint32));
|
||||||
optr += 4;
|
optr += sizeof(uint32);
|
||||||
totsize += 4;
|
totsize += sizeof(uint32);
|
||||||
|
loc += sizeof(uint32);
|
||||||
#ifdef PGIS_DEBUG
|
#ifdef PGIS_DEBUG
|
||||||
elog(NOTICE, " collection header size:%d", totsize);
|
lwnotice("lwgeom_force2d_recursive: added collection ngeoms - size:%d", totsize);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Now recurse for each suboject
|
#ifdef PGIS_DEBUG
|
||||||
|
lwnotice("lwgeom_force2d_recursive: inspecting subgeoms");
|
||||||
|
#endif
|
||||||
|
// Now recurse for each subobject
|
||||||
inspected = lwgeom_inspect(serialized);
|
inspected = lwgeom_inspect(serialized);
|
||||||
for (i=0; i<inspected->ngeometries; i++)
|
for (i=0; i<inspected->ngeometries; i++)
|
||||||
{
|
{
|
||||||
|
@ -811,12 +899,17 @@ elog(NOTICE, " collection header size:%d", totsize);
|
||||||
totsize += size;
|
totsize += size;
|
||||||
optr += size;
|
optr += size;
|
||||||
#ifdef PGIS_DEBUG
|
#ifdef PGIS_DEBUG
|
||||||
elog(NOTICE, " elem %d size: %d (tot: %d)", i, size, totsize);
|
lwnotice("lwgeom_force2d_recursive: added elem %d size: %d (tot: %d)",
|
||||||
|
i, size, totsize);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
pfree_inspected(inspected);
|
pfree_inspected(inspected);
|
||||||
|
|
||||||
*retsize = totsize;
|
#ifdef PGIS_DEBUG
|
||||||
|
lwnotice("lwgeom_force2d_recursive returning");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( retsize ) *retsize = totsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -840,6 +933,7 @@ lwgeom_force3dz_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
||||||
POINTARRAY newpts;
|
POINTARRAY newpts;
|
||||||
POINTARRAY **nrings;
|
POINTARRAY **nrings;
|
||||||
uchar *loc;
|
uchar *loc;
|
||||||
|
POINT3DZ point3dz;
|
||||||
|
|
||||||
|
|
||||||
#ifdef PGIS_DEBUG
|
#ifdef PGIS_DEBUG
|
||||||
|
@ -855,7 +949,8 @@ lwgeom_force3dz_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
||||||
newpts.npoints = 1;
|
newpts.npoints = 1;
|
||||||
newpts.serialized_pointlist = lwalloc(sizeof(POINT3DZ));
|
newpts.serialized_pointlist = lwalloc(sizeof(POINT3DZ));
|
||||||
loc = newpts.serialized_pointlist;
|
loc = newpts.serialized_pointlist;
|
||||||
getPoint3dz_p(point->point, 0, (POINT3DZ *)loc);
|
getPoint3dz_p(point->point, 0, &point3dz);
|
||||||
|
memcpy(loc, &point3dz, sizeof(POINT3DZ));
|
||||||
point->point = &newpts;
|
point->point = &newpts;
|
||||||
TYPE_SETZM(point->type, 1, 0);
|
TYPE_SETZM(point->type, 1, 0);
|
||||||
lwpoint_serialize_buf(point, optr, retsize);
|
lwpoint_serialize_buf(point, optr, retsize);
|
||||||
|
@ -877,7 +972,8 @@ elog(NOTICE, "lwgeom_force3dz_recursive: it's a line");
|
||||||
loc = newpts.serialized_pointlist;
|
loc = newpts.serialized_pointlist;
|
||||||
for (j=0; j<line->points->npoints; j++)
|
for (j=0; j<line->points->npoints; j++)
|
||||||
{
|
{
|
||||||
getPoint3dz_p(line->points, j, (POINT3DZ *)loc);
|
getPoint3dz_p(line->points, j, &point3dz);
|
||||||
|
memcpy(loc, &point3dz, sizeof(POINT3DZ));
|
||||||
loc+=sizeof(POINT3DZ);
|
loc+=sizeof(POINT3DZ);
|
||||||
}
|
}
|
||||||
line->points = &newpts;
|
line->points = &newpts;
|
||||||
|
@ -908,7 +1004,8 @@ elog(NOTICE, "lwgeom_force3dz_recursive: it's a line, size:%d", *retsize);
|
||||||
loc = nring->serialized_pointlist;
|
loc = nring->serialized_pointlist;
|
||||||
for (k=0; k<ring->npoints; k++)
|
for (k=0; k<ring->npoints; k++)
|
||||||
{
|
{
|
||||||
getPoint3dz_p(ring, k, (POINT3DZ *)loc);
|
getPoint3dz_p(ring, k, &point3dz);
|
||||||
|
memcpy(loc, &point3dz, sizeof(POINT3DZ));
|
||||||
loc+=sizeof(POINT3DZ);
|
loc+=sizeof(POINT3DZ);
|
||||||
}
|
}
|
||||||
nrings[j] = nring;
|
nrings[j] = nring;
|
||||||
|
@ -1001,9 +1098,8 @@ lwgeom_force3dm_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
||||||
LWPOLY *poly = NULL;
|
LWPOLY *poly = NULL;
|
||||||
POINTARRAY newpts;
|
POINTARRAY newpts;
|
||||||
POINTARRAY **nrings;
|
POINTARRAY **nrings;
|
||||||
POINT3DM *p3dm;
|
POINT3DM p3dm;
|
||||||
uchar *loc;
|
uchar *loc;
|
||||||
char check;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef PGIS_DEBUG
|
#ifdef PGIS_DEBUG
|
||||||
|
@ -1019,8 +1115,8 @@ lwgeom_force3dm_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
||||||
newpts.npoints = 1;
|
newpts.npoints = 1;
|
||||||
newpts.serialized_pointlist = lwalloc(sizeof(POINT3DM));
|
newpts.serialized_pointlist = lwalloc(sizeof(POINT3DM));
|
||||||
loc = newpts.serialized_pointlist;
|
loc = newpts.serialized_pointlist;
|
||||||
p3dm = (POINT3DM *)loc;
|
getPoint3dm_p(point->point, 0, &p3dm);
|
||||||
getPoint3dm_p(point->point, 0, p3dm);
|
memcpy(loc, &p3dm, sizeof(POINT3DM));
|
||||||
point->point = &newpts;
|
point->point = &newpts;
|
||||||
TYPE_SETZM(point->type, 0, 1);
|
TYPE_SETZM(point->type, 0, 1);
|
||||||
lwpoint_serialize_buf(point, optr, retsize);
|
lwpoint_serialize_buf(point, optr, retsize);
|
||||||
|
@ -1047,15 +1143,10 @@ elog(NOTICE, "lwgeom_force3dm_recursive: %d bytes pointlist allocated", sizeof(P
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
loc = newpts.serialized_pointlist;
|
loc = newpts.serialized_pointlist;
|
||||||
check = TYPE_NDIMS(line->points->dims);
|
|
||||||
for (j=0; j<line->points->npoints; j++)
|
for (j=0; j<line->points->npoints; j++)
|
||||||
{
|
{
|
||||||
getPoint3dm_p(line->points, j, (POINT3DM *)loc);
|
getPoint3dm_p(line->points, j, &p3dm);
|
||||||
if ( check != TYPE_NDIMS(line->points->dims) )
|
memcpy(loc, &p3dm, sizeof(POINT3DM));
|
||||||
{
|
|
||||||
lwerror("getPoint3dm_p messed with input pointarray");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
loc+=sizeof(POINT3DM);
|
loc+=sizeof(POINT3DM);
|
||||||
}
|
}
|
||||||
line->points = &newpts;
|
line->points = &newpts;
|
||||||
|
@ -1089,7 +1180,8 @@ lwnotice("lwgeom_force3dm_recursive returning");
|
||||||
loc = nring->serialized_pointlist;
|
loc = nring->serialized_pointlist;
|
||||||
for (k=0; k<ring->npoints; k++)
|
for (k=0; k<ring->npoints; k++)
|
||||||
{
|
{
|
||||||
getPoint3dm_p(ring, k, (POINT3DM *)loc);
|
getPoint3dm_p(ring, k, &p3dm);
|
||||||
|
memcpy(loc, &p3dm, sizeof(POINT3DM));
|
||||||
loc+=sizeof(POINT3DM);
|
loc+=sizeof(POINT3DM);
|
||||||
}
|
}
|
||||||
nrings[j] = nring;
|
nrings[j] = nring;
|
||||||
|
@ -1216,6 +1308,7 @@ lwgeom_force4d_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
||||||
LWPOLY *poly = NULL;
|
LWPOLY *poly = NULL;
|
||||||
POINTARRAY newpts;
|
POINTARRAY newpts;
|
||||||
POINTARRAY **nrings;
|
POINTARRAY **nrings;
|
||||||
|
POINT4D p4d;
|
||||||
uchar *loc;
|
uchar *loc;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1232,7 +1325,8 @@ lwgeom_force4d_recursive(uchar *serialized, uchar *optr, size_t *retsize)
|
||||||
newpts.npoints = 1;
|
newpts.npoints = 1;
|
||||||
newpts.serialized_pointlist = lwalloc(sizeof(POINT4D));
|
newpts.serialized_pointlist = lwalloc(sizeof(POINT4D));
|
||||||
loc = newpts.serialized_pointlist;
|
loc = newpts.serialized_pointlist;
|
||||||
getPoint4d_p(point->point, 0, (POINT4D *)loc);
|
getPoint4d_p(point->point, 0, &p4d);
|
||||||
|
memcpy(loc, &p4d, sizeof(POINT4D));
|
||||||
point->point = &newpts;
|
point->point = &newpts;
|
||||||
TYPE_SETZM(point->type, 1, 1);
|
TYPE_SETZM(point->type, 1, 1);
|
||||||
lwpoint_serialize_buf(point, optr, retsize);
|
lwpoint_serialize_buf(point, optr, retsize);
|
||||||
|
@ -1254,7 +1348,8 @@ elog(NOTICE, "lwgeom_force4d_recursive: it's a line");
|
||||||
loc = newpts.serialized_pointlist;
|
loc = newpts.serialized_pointlist;
|
||||||
for (j=0; j<line->points->npoints; j++)
|
for (j=0; j<line->points->npoints; j++)
|
||||||
{
|
{
|
||||||
getPoint4d_p(line->points, j, (POINT4D *)loc);
|
getPoint4d_p(line->points, j, &p4d);
|
||||||
|
memcpy(loc, &p4d, sizeof(POINT4D));
|
||||||
loc+=sizeof(POINT4D);
|
loc+=sizeof(POINT4D);
|
||||||
}
|
}
|
||||||
line->points = &newpts;
|
line->points = &newpts;
|
||||||
|
@ -1285,7 +1380,8 @@ elog(NOTICE, "lwgeom_force4d_recursive: it's a line, size:%d", *retsize);
|
||||||
loc = nring->serialized_pointlist;
|
loc = nring->serialized_pointlist;
|
||||||
for (k=0; k<ring->npoints; k++)
|
for (k=0; k<ring->npoints; k++)
|
||||||
{
|
{
|
||||||
getPoint4d_p(ring, k, (POINT4D *)loc);
|
getPoint4d_p(ring, k, &p4d);
|
||||||
|
memcpy(loc, &p4d, sizeof(POINT4D));
|
||||||
loc+=sizeof(POINT4D);
|
loc+=sizeof(POINT4D);
|
||||||
}
|
}
|
||||||
nrings[j] = nring;
|
nrings[j] = nring;
|
||||||
|
|
Loading…
Reference in a new issue