Обсуждение: xmalloc => pg_malloc

Поиск
Список
Период
Сортировка

xmalloc => pg_malloc

От
Tom Lane
Дата:
While looking around to fix the pg_malloc(0) issue, I noticed that
various other pieces of code such as pg_basebackup have essentially
identical functions, except they're called xmalloc().  I propose to
standardize all these things on this set of names:
pg_mallocpg_malloc0    (for malloc-and-zero behavior)pg_calloc    (randomly different API for
pg_malloc0)pg_reallocpg_freepg_strdup

Any objections?
        regards, tom lane



Re: xmalloc => pg_malloc

От
Andres Freund
Дата:
On Tuesday, October 02, 2012 06:02:13 PM Tom Lane wrote:
> While looking around to fix the pg_malloc(0) issue, I noticed that
> various other pieces of code such as pg_basebackup have essentially
> identical functions, except they're called xmalloc().  I propose to
> standardize all these things on this set of names:
> 
>     pg_malloc
>     pg_malloc0    (for malloc-and-zero behavior)
>     pg_calloc    (randomly different API for pg_malloc0)
Do we need this?

>     pg_realloc
>     pg_free
>     pg_strdup
I wonder whether the same set of functions should also be available in the 
backend with ereport(EC_OUT_OF_MEMORY, ...) behaviour as well. As noted before 
the are quite some malloc() calls around. Not all of them should be replaced, 
but I think quite some could.

Andres
-- 
Andres Freund        http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services



Re: xmalloc => pg_malloc

От
Bruce Momjian
Дата:
On Tue, Oct  2, 2012 at 12:02:13PM -0400, Tom Lane wrote:
> While looking around to fix the pg_malloc(0) issue, I noticed that
> various other pieces of code such as pg_basebackup have essentially
> identical functions, except they're called xmalloc().  I propose to
> standardize all these things on this set of names:
> 
>     pg_malloc
>     pg_malloc0    (for malloc-and-zero behavior)
>     pg_calloc    (randomly different API for pg_malloc0)
>     pg_realloc
>     pg_free
>     pg_strdup
> 
> Any objections?

Please standarize.  I am totally confused by the many memory
implementations we have.  (Pg_upgrade uses pg_malloc().)

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + It's impossible for everything to be true. +



Re: xmalloc => pg_malloc

От
Tom Lane
Дата:
Andres Freund <andres@2ndquadrant.com> writes:
>> pg_calloc    (randomly different API for pg_malloc0)

> Do we need this?

I thought about getting rid of it, but there are some dozens of calls
scattered across several files, so I wasn't sure it was worth it.
Anybody else have an opinion?

> I wonder whether the same set of functions should also be available in the 
> backend with ereport(EC_OUT_OF_MEMORY, ...) behaviour as well.

In the backend, you almost always ought to be using palloc instead.
The only places where it's really appropriate to be using malloc
directly are where you don't want an error thrown for out-of-memory.
So I think providing these in the backend would do little except to
encourage bad programming.
        regards, tom lane



Re: xmalloc => pg_malloc

От
Phil Sorber
Дата:
On Tue, Oct 2, 2012 at 12:30 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Andres Freund <andres@2ndquadrant.com> writes:
>>> pg_calloc    (randomly different API for pg_malloc0)
>
>> Do we need this?
>
> I thought about getting rid of it, but there are some dozens of calls
> scattered across several files, so I wasn't sure it was worth it.
> Anybody else have an opinion?

I think having more than 1 function that does the same thing is
generally a bad idea. It sounds like it is going to cause confusion
and provide no real benefit.

>
>> I wonder whether the same set of functions should also be available in the
>> backend with ereport(EC_OUT_OF_MEMORY, ...) behaviour as well.
>
> In the backend, you almost always ought to be using palloc instead.
> The only places where it's really appropriate to be using malloc
> directly are where you don't want an error thrown for out-of-memory.
> So I think providing these in the backend would do little except to
> encourage bad programming.
>
>                         regards, tom lane
>
>
> --
> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers



Re: xmalloc => pg_malloc

От
Andres Freund
Дата:
On Tuesday, October 02, 2012 06:30:33 PM Tom Lane wrote:
> Andres Freund <andres@2ndquadrant.com> writes:
> >> pg_calloc    (randomly different API for pg_malloc0)
> > 
> > Do we need this?
> 
> I thought about getting rid of it, but there are some dozens of calls
> scattered across several files, so I wasn't sure it was worth it.
I always found calloc to be a pointless API but by now I have learned what it 
means so I don't have a strong opinion.


> > I wonder whether the same set of functions should also be available in
> > the backend with ereport(EC_OUT_OF_MEMORY, ...) behaviour as well.
> 
> In the backend, you almost always ought to be using palloc instead.
> The only places where it's really appropriate to be using malloc
> directly are where you don't want an error thrown for out-of-memory.
> So I think providing these in the backend would do little except to
> encourage bad programming.
We seem to have 100+ usages of malloc() anyway. Several of those are in helper 
libraries like regex/* though. A quick grep shows most of the others to be 
valid in my opinion. Mostly its allocating memory which is never deallocated 
but to big to unconditionally allocated.

The quick grep showed that at least src/backend/utils/misc/ps_status.c doesn't 
properly check the return value. Others (mctx.c) use Asserts...

Andres
-- 
Andres Freund        http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services



Re: xmalloc => pg_malloc

От
Peter Eisentraut
Дата:
On Tue, 2012-10-02 at 12:02 -0400, Tom Lane wrote:
> While looking around to fix the pg_malloc(0) issue, I noticed that
> various other pieces of code such as pg_basebackup have essentially
> identical functions, except they're called xmalloc().  I propose to
> standardize all these things on this set of names:
> 
>     pg_malloc
>     pg_malloc0    (for malloc-and-zero behavior)
>     pg_calloc    (randomly different API for pg_malloc0)
>     pg_realloc
>     pg_free
>     pg_strdup
> 
> Any objections?

xmalloc, xstrdup, etc. are pretty common names for functions that do
alloc-or-die (another possible naming scheme ;-) ).  The naming
pg_malloc etc. on the other hand suggests that the allocation is being
done in a PostgreSQL-specific way, and anyway sounds too close to
palloc.

So I'd be more in favor of xmalloc <= pg_malloc.






Re: xmalloc => pg_malloc

От
Tom Lane
Дата:
Peter Eisentraut <peter_e@gmx.net> writes:
> xmalloc, xstrdup, etc. are pretty common names for functions that do
> alloc-or-die (another possible naming scheme ;-) ).  The naming
> pg_malloc etc. on the other hand suggests that the allocation is being
> done in a PostgreSQL-specific way, and anyway sounds too close to
> palloc.

> So I'd be more in favor of xmalloc <= pg_malloc.

Meh.  The fact that other people use that name is not really an
advantage from where I sit.  I'm concerned about possible name
collisions, eg in libraries loaded into the backend.

There are probably not any actual risks of collision right now, given
that all these functions are currently in our client-side programs ---
but it's foreseeable that we might use this same naming convention in
more-exposed places in future.  In fact, somebody was already proposing
creating such functions in the core backend.

But having said that, I'm not absolutely wedded to these names; they
were just the majority of existing cases.
        regards, tom lane



Re: xmalloc => pg_malloc

От
Jon Nelson
Дата:
On Wed, Oct 3, 2012 at 11:36 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Peter Eisentraut <peter_e@gmx.net> writes:
>> xmalloc, xstrdup, etc. are pretty common names for functions that do
>> alloc-or-die (another possible naming scheme ;-) ).  The naming
>> pg_malloc etc. on the other hand suggests that the allocation is being
>> done in a PostgreSQL-specific way, and anyway sounds too close to
>> palloc.
>
>> So I'd be more in favor of xmalloc <= pg_malloc.
>
> Meh.  The fact that other people use that name is not really an
> advantage from where I sit.  I'm concerned about possible name
> collisions, eg in libraries loaded into the backend.
>
> There are probably not any actual risks of collision right now, given
> that all these functions are currently in our client-side programs ---
> but it's foreseeable that we might use this same naming convention in
> more-exposed places in future.  In fact, somebody was already proposing
> creating such functions in the core backend.
>
> But having said that, I'm not absolutely wedded to these names; they
> were just the majority of existing cases.

Why not split the difference and use pg_xmalloc?
As in: "PostgreSQL-special malloc that dies on failure."

-- 
Jon