From 02f9ac6e654a3c2d709c460bb4e7cf17fab83d81 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 23 Nov 2006 03:52:05 +0000 Subject: [PATCH] Shared Memory Hooks Documentation This patch, against xfunc.sgml, adds a new subsection 33.9.12, Shared Memory and LWLocks in C-Language Functions, describing how shared memory and lwlocks may be requested by C add-in functions. Marc Munro --- doc/src/sgml/xfunc.sgml | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml index ce1fbee11e..3e338ab511 100644 --- a/doc/src/sgml/xfunc.sgml +++ b/doc/src/sgml/xfunc.sgml @@ -2906,6 +2906,54 @@ make_array(PG_FUNCTION_ARGS) CREATE FUNCTION make_array(anyelement) RETURNS anyarray AS 'DIRECTORY/funcs', 'make_array' LANGUAGE C IMMUTABLE; + + + + + Shared Memory and LWLocks in C-Language Functions + + + Add-ins may reserve LWLocks and an allocation of shared memory on server + startup. The add-in's shared library must be preloaded, by specifying + it in + shared-preload-libraries, + and the shared memory must be reserved by calling: + +void RequestAddinShmemSpace(int size) + + from your _PG_init function. + + + LWLocks are reserved by calling: + +void RequestAddinLWLocks(int n) + + from _PG_init. + + + To avoid possible race-conditions, each backend should use the LWLock + AddinShmemInitLock when connecting to and intializing + its allocation of shared memory, as shown here: + + + static mystruct *ptr = NULL; + + if (!ptr) + { + bool found; + + LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); + ptr = ShmemInitStruct("my struct name", size, &found); + if (!ptr) + elog(ERROR, "out of shared memory"); + if (!found) + { + initialize contents of shmem area; + acquire any requested LWLocks using: + ptr->mylockid = LWLockAssign(); + } + LWLockRelease(AddinShmemInitLock); + } -- 2.39.5