Skip site navigation (1) Skip section navigation (2)

Bug #548: Misleading documentation of `palloc'

From: pgsql-bugs(at)postgresql(dot)org
To: pgsql-bugs(at)postgresql(dot)org
Subject: Bug #548: Misleading documentation of `palloc'
Date: 2002-01-02 08:24:42
Message-ID: 200201020824.g028Og657198@postgresql.org (view raw or flat)
Thread:
Lists: pgsql-bugs
Holger Krug (hkrug(at)rationalizer(dot)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


Responses

pgsql-bugs by date

Next:From: Tom LaneDate: 2002-01-02 16:28:08
Subject: Re: Bug #548: Misleading documentation of `palloc'
Previous:From: Tom LaneDate: 2002-01-01 23:01:06
Subject: Re: Bug #547: postmaster enters infinite loop if lock file creation fails?

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group