[postgis-devel] PgSQL Memory Stuff

Paul Ramsey pramsey at cleverelephant.ca
Sun Dec 12 08:16:53 PST 2010


Svn up Nik, I am pretty sure I retrofitted most of your functions already (though not completely, just to the point necessary to remove appeals to the serialized from macro).

Regards profstart, etc, those are old profiling macros, you can remove them.

Regards the null return, yes strictly speaking you should clean up before returning. Or perhaps strictly speaking you shouldn't ... Remember, pgsql is going to clean up after you anyways :)

P.

On 2010-12-12, at 5:19 AM, Nicklas Avén <nicklas.aven at jordogskog.no> wrote:

> I have been looking through the measure functions according to the
> example below, (in 2D I think you have fixed most of it Paul, but not in
> 3d). 
> 
> I have two questions
> 
> question 1) In LWGEOM_mindistance2d for instance there is this 
> 
>    PROFSTART(PROF_QRUN)
> 
> and 
> 
>    PROFSTOP(PROF_QRUN);
>        PROFREPORT("dist",geom1, geom2, NULL); 
> 
> I have just left it there earlier because I have had no idea what it is
> for.
> Can I just remove it? I see very few other functions have this profile
> thing. Or is it of any use?
> 
> 
> question 2) 
> 
> In the example below there is this null-return if the result is empty:
> 
>    if (lwgeom_is_empty(theline))
>        PG_RETURN_NULL();
> 
> Should we care about freeing stuff in this case too. I guess it wouldn't
> be anything wrong in doing it at least?
> 
> like:
> if (lwgeom_is_empty(theline)) 
> {
>    
>    lwgeom_free(theline);
>    lwgeom_free(lwgeom1);
>    lwgeom_free(lwgeom2);
>    PG_FREE_IF_COPY(geom1, 0);
>    PG_FREE_IF_COPY(geom2, 1);
>    PG_RETURN_NULL();
> }
> 
> As I understand it there should not be any problem freeing "theline"
> with lwgeom_free even if it is empty in any way.
> 
> 
> 
> Thanks
> 
> Nicklas
> 
> 
> 
> 
> 
> 
> On Tue, 2010-12-07 at 16:27 -0800, Paul Ramsey wrote:
>> Nik,
>> Here's an annotated version of one of your functions, none of this
>> stuff is critical, since pgsql just cleans right up behind you, but in
>> case you want to do it "right"...
>> 
>> 
>> PG_FUNCTION_INFO_V1(LWGEOM_shortestline2d);
>> Datum LWGEOM_shortestline2d(PG_FUNCTION_ARGS)
>> {
>>    PG_LWGEOM *result;
>>    /* Detoast the actual PgSQL varlena structures, in our case PG_LWGEOM
>> (soon to be GSERIALIZED) */
>>    PG_LWGEOM *geom1 = (PG_LWGEOM*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
>>    PG_LWGEOM *geom2 = (PG_LWGEOM*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
>>    /* Build LWGEOM from the varlena (soon to be with lwgeom_from_gserialized) */
>>    LWGEOM *lwgeom1 = pglwgeom_deserialize(geom1);
>>    LWGEOM *lwgeom2 = pglwgeom_deserialize(geom2);
>>    LWGEOM *theline;
>> 
>> 
>>    if (lwgeom1->srid != lwgeom2->srid)
>>    {
>>        elog(ERROR,"Operation on two GEOMETRIES with different SRIDs\n");
>>        PG_RETURN_NULL();
>>    }
>> 
>>    theline = lw_dist2d_distanceline(lwgeom1, lwgeom2, lwgeom1->srid, DIST_MIN);
>>    if (lwgeom_is_empty(theline))
>>        PG_RETURN_NULL();
>> 
>>    /* Serialize the result back down from LWGEOM, but don't return right away */
>>    result = pglwgeom_serialize(theline);
>>    /* First free the LWGEOMs you used */
>>    lwgeom_free(lwgeom1);
>>    lwgeom_free(lwgeom2);
>> 
>>    /* Then call free_if_copy on the *varlena* structures you originally
>> get as arguments */
>>    PG_FREE_IF_COPY(geom1, 0);
>>    PG_FREE_IF_COPY(geom2, 1);
>> 
>>    /* And now return */
>>    PG_RETURN_POINTER(result);
>> }
>> _______________________________________________
>> postgis-devel mailing list
>> postgis-devel at postgis.refractions.net
>> http://postgis.refractions.net/mailman/listinfo/postgis-devel
>> 
> 
> 
> _______________________________________________
> postgis-devel mailing list
> postgis-devel at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-devel



More information about the postgis-devel mailing list