Bug #548: Misleading documentation of `palloc'

Started by PostgreSQL Bugs Listover 24 years ago3 messagesbugs
Jump to latest
#1PostgreSQL Bugs List
pgsql-bugs@postgresql.org

Holger Krug (hkrug@rationalizer.com) reports a bug with a severity of 2
The lower the number the more severe it is.

Short Description
Misleading documentation of `palloc'

Long Description
In section 12.5.6 "Writing Code" of the "PostgreSQL 7.2 Programmer's
Guide" the following is said:

"When allocating memory, use the PostgreSQL routines `palloc' and
`pfree' instead of the corresponding C library routines `malloc' and
`free'. The memory allocated by `palloc' will be freed automatically
at the end of each transaction, preventing memory leaks."

This is not actually wrong but *misleading*, because memory allocated by `palloc' in a user-defined server-side C language function is freed not only at transaction end but actually at the end of each TransactionCommand - or even more: at the end of each expression evaluation. The reason is, that the `CurrentMemoryContext' used for the evaluation of such functions is `PlanExprContext', which is a
child of `TransactionCommandContext', which is a child of
`TopTransactionContext'.

As a consequence is appears that, given the following situation:

- a user-defined function `get_pointer()' which allocates server
memory (with `palloc') and returns a pointer to it
- a user-defined function `get_data(pointer)' which gets the pointer
as an argument and returns the data saved at the allocated memory

it is possible to use `get_pointer()' and `get_data(pointer)' together
if used within one expression, but it is impossible to use them in two
different expressions:

- `get_data(get_pointer())' will work
- the following PLpgSQL command sequence won't work:

DECLARE
p pointer;
BEGIN
p := get_pointer();
RETURN get_data(p);
END;

I propose to make the documentation more concise in this point and to add a macro like:

#define palloc_tx(sz) MemoryContextAlloc(TopTransactionContext, (sz))

for the convenience of the server-side programmer to be used for memory allocation in server-side functions, in cases when the allocated memory shall be valid up to the end of the current transaction.

Sample Code

No file was uploaded with this report

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: PostgreSQL Bugs List (#1)
Re: Bug #548: Misleading documentation of `palloc'

pgsql-bugs@postgresql.org writes:

I propose to make the documentation more concise in this point and to
add a macro like:

#define palloc_tx(sz) MemoryContextAlloc(TopTransactionContext, (sz))

I don't think it's a good idea to encourage people to allocate in
TopTransactionContext as a substitute for thought. One of the main
reasons for developing the memory context mechanism was to get rid
of transaction-duration memory leaks. People who want to allocate
storage that will outlive a single function call need to think about
exactly how long it needs to live and when/where/how it will be
released.

I agree that the particular paragraph you identified is oversimplified,
but the right thing is to fix the documentation not add another layer
of oversimplification.

regards, tom lane

#3Bruce Momjian
bruce@momjian.us
In reply to: PostgreSQL Bugs List (#1)
Re: Bug #548: Misleading documentation of `palloc'

Developer's FAQ updated to:

<P><I>palloc()</I> and <I>pfree()</I> are used in place of malloc()
and free() because we find it easier to automatically free all
memory allocated when a query completes. This assures us that all
memory that was allocated gets freed even if we have lost track of
where we allocated it. There are special non-query contexts that
memory can be allocated in. These affect when the allocated memory
is freed by the backend.</P>

---------------------------------------------------------------------------

pgsql-bugs@postgresql.org wrote:

Holger Krug (hkrug@rationalizer.com) reports a bug with a severity of 2
The lower the number the more severe it is.

Short Description
Misleading documentation of `palloc'

Long Description
In section 12.5.6 "Writing Code" of the "PostgreSQL 7.2 Programmer's
Guide" the following is said:

"When allocating memory, use the PostgreSQL routines `palloc' and
`pfree' instead of the corresponding C library routines `malloc' and
`free'. The memory allocated by `palloc' will be freed automatically
at the end of each transaction, preventing memory leaks."

This is not actually wrong but *misleading*, because memory allocated by `palloc' in a user-defined server-side C language function is freed not only at transaction end but actually at the end of each TransactionCommand - or even more: at the end of each expression evaluation. The reason is, that the `CurrentMemoryContext' used for the evaluation of such functions is `PlanExprContext', which is a
child of `TransactionCommandContext', which is a child of
`TopTransactionContext'.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026