pgsql: Introduce a bump memory allocator

Поиск
Список
Период
Сортировка
От David Rowley
Тема pgsql: Introduce a bump memory allocator
Дата
Msg-id E1rtRFE-000y8T-SU@gemulon.postgresql.org
обсуждение исходный текст
Ответы Re: pgsql: Introduce a bump memory allocator  (Peter Eisentraut <peter@eisentraut.org>)
Список pgsql-committers
Introduce a bump memory allocator

This introduces a bump MemoryContext type.  The bump context is best
suited for short-lived memory contexts which require only allocations
of memory and never a pfree or repalloc, which are unsupported.

Memory palloc'd into a bump context has no chunk header.  This makes
bump a useful context type when lots of small allocations need to be
done without any need to pfree those allocations.  Allocation sizes are
rounded up to the next MAXALIGN boundary, so with this and no chunk
header, allocations are very compact indeed.

Allocations are also very fast as bump does not check any freelists to
try and make use of previously free'd chunks.  It just checks if there
is enough room on the current block, and if so it bumps the freeptr
beyond this chunk and returns the value that the freeptr was previously
pointing to.  Simple and fast.  A new block is malloc'd when there's not
enough space in the current block.

Code using the bump allocator must take care never to call any functions
which could try to call realloc() (or variants), pfree(),
GetMemoryChunkContext() or GetMemoryChunkSpace() on a bump allocated
chunk.  Due to lack of chunk headers, these operations are unsupported.
To increase the chances of catching such issues, when compiled with
MEMORY_CONTEXT_CHECKING, bump allocated chunks are given a header and
any attempt to perform an unsupported operation will result in an ERROR.
Without MEMORY_CONTEXT_CHECKING, code attempting an unsupported
operation could result in a segfault.

A follow-on commit will implement the first user of bump.

Author: David Rowley
Reviewed-by: Nathan Bossart
Reviewed-by: Matthias van de Meent
Reviewed-by: Tomas Vondra
Reviewed-by: John Naylor
Discussion: https://postgr.es/m/CAApHDvqGSpCU95TmM=Bp=6xjL_nLys4zdZOpfNyWBk97Xrdj2w@mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/29f6a959cfd8ffa7d6db2c0629439c5329e2853e

Modified Files
--------------
src/backend/nodes/gen_node_support.pl |   2 +-
src/backend/utils/mmgr/Makefile       |   1 +
src/backend/utils/mmgr/bump.c         | 811 ++++++++++++++++++++++++++++++++++
src/backend/utils/mmgr/mcxt.c         |  15 +-
src/backend/utils/mmgr/meson.build    |   1 +
src/include/nodes/memnodes.h          |   3 +-
src/include/utils/memutils.h          |   7 +
src/include/utils/memutils_internal.h |  18 +-
src/tools/pgindent/typedefs.list      |   2 +
9 files changed, 856 insertions(+), 4 deletions(-)


В списке pgsql-committers по дате отправления:

Предыдущее
От: David Rowley
Дата:
Сообщение: pgsql: Enlarge bit-space for MemoryContextMethodID
Следующее
От: Alvaro Herrera
Дата:
Сообщение: [MASSMAIL]pgsql: Add XLogCtl->logInsertResult