Обсуждение: Bug #548: Misleading documentation of `palloc'
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
languagefunction 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
ofsuch 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
whenthe allocated memory shall be valid up to the end of the current transaction.
Sample Code
No file was uploaded with this report
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
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
languagefunction 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
ofsuch 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