Re: Freeing memory in native extension in case of error

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Gabriel Furstenheim Milerud <furstenheim(at)gmail(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Freeing memory in native extension in case of error
Date: 2017-06-15 20:07:46
Message-ID: 28982.1497557266@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Gabriel Furstenheim Milerud <furstenheim(at)gmail(dot)com> writes:
> I've written an extension in C to sum jsonb. For that I use the
> jsonbiterator defined in
> https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/jsonb_util.c#L743

> In the comments of JsonbIteratorNext it states: 'Callers in such a
> scenario, that are particularly sensitive to leaking memory in a
> long-lived context may walk the ancestral tree from the final iterator
> we left them with to its oldest ancestor, pfree()ing as they go'

> In the extension that I've written, I sometimes stop in the middle of
> an iteration, but only to raise an error (if the json contains a not
> numeric value), with 'ereport(ERROR, ...'

> Do I have to free the memory in that case?

I wouldn't bother, assuming that it's all in the short-lived query
context (the one that's current when your function is called).
Error cleanup will flush that context automatically.

Really, for memory in that context, it's unlikely to matter even
if you are sloppy and leak memory on normal non-error return.
That context will get reset after each row processed by the
query anyway. It's only if you're trying to cache data across
rows, or in even longer-lived ways, that you really need to be
careful.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2017-06-15 20:13:40 Re: Connection options
Previous Message Gabriel Furstenheim Milerud 2017-06-15 20:00:11 Freeing memory in native extension in case of error