Re: C-language functions: SRF question

From: Jorge Arevalo <jorgearevalo(at)gis4free(dot)org>
To: Merlin Moncure <mmoncure(at)gmail(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: C-language functions: SRF question
Date: 2010-04-08 17:04:28
Message-ID: z2xd321138e1004081004g54add743q5d4c940d6fa28cb8@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Thu, Apr 8, 2010 at 6:18 PM, Merlin Moncure <mmoncure(at)gmail(dot)com> wrote:
> On Thu, Apr 8, 2010 at 11:40 AM, Jorge Arevalo
> <jorgearevalo(at)gis4free(dot)org> wrote:
>> Is this a good way of doing it? Is it possible? And another small
>> question: if the memory for my array of structs is allocated inside
>> the function that provides me the array, should I deallocate it in the
>> SRF? Using pfree? It wasn't allocated by palloc...
>
> why didn't you use palloc? external library? postgresql guarantees
> that memory allocated w/palloc is cleaned up.  you pretty much have to
> assume any backend api calls can bounce you out of the transaction in
> which case you will leak if you alloc'd with non palloc allocator.  do
> not call pfree on any memory allocated by anything else than palloc.
> every malloc needs a free.
>
> if the array construction code is also yours you may want to consider
> reworking it to take an allocator.   the more you use palloc the less
> problems you will have (and as a bonus, you get to worry less about
> pfree'ing stuff).
>
> if you must use malloc and don't want to be cavalier about leaking
> memory, try and keep allocations as short lived as possible or at very
> specific points, like a static pointer.
>

The memory is allocated in a function of an external library. But I
can force this library to allocate memory in a valid context (the one
pointed by fcinfo->flinfo->fn_mcxt, actually). If I do that, I suppose
I can call pfree. Or even better, I don't need to worry about that,
am I right?

BTW, this code is for WKT Raster. A PostGIS extension. We can use the
memory context I said (fcinfo->flinfo->fn_mcxt) to allocate memory
when we need to call one of our functions from a standard "version 1"
function, but is this the right context? I mean, the context we should
use for a whole-plugin-lifetime persistence.

> be sure to review the memory manager readme in src/backend/utils/mmgr/README
>
Excelent reading! Thanks for the info. And sorry if my questions are very basic.

Best regards,
Jorge

> merlin
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Joseph S 2010-04-08 17:30:27 Postgres doesn't seem to enforce array dimensions
Previous Message Greg Stark 2010-04-08 16:45:42 Re: Cannot read block 348938 of pdbsynchtable